大家。我是Postgresql的初学者。最近我遇到一个问题。我有一张叫“ sales”的桌子。
create table sales
(
cust varchar(20),
prod varchar(20),
day integer,
month integer,
year integer,
state char(2),
quant integer
);
insert into sales values ('Bloom', 'Pepsi', 2, 12, 2001, 'NY', 4232);
insert into sales values ('Knuth', 'Bread', 23, 5, 2005, 'PA', 4167);
insert into sales values ('Emily', 'Pepsi', 22, 1, 2006, 'CT', 4404);
insert into sales values ('Emily', 'Fruits', 11, 1, 2000, 'NJ', 4369);
insert into sales values ('Helen', 'Milk', 7, 11, 2006, 'CT', 210);
insert into sales values ('Emily', 'Soap', 2, 4, 2002, 'CT', 2549);
insert into sales values ('Bloom', 'Eggs', 30, 11, 2000, 'NJ', 559);
....总共有498行。这是此表的概述:
现在,我要计算每种产品的最大和最小销售数量,以及其相应的客户(购买产品),日期(即那些最大和最小销售数量的日期)以及销售交易发生的状态。以及相应产品的平均销售数量。
合并后的应该像这样:
它应该有10行,因为总共有10种不同的产品。
我试过了:
select prod,
max(quant),
cust as MAX_CUST
from sales
group by prod;
但它返回了一个错误,并表示应将客户归为“ by by”。但是我只想按产品类型分类。
此外,如何将max_q及其客户,日期,状态与min_q及其客户,日期,状态以及AVG_Q的产品名称水平组合?我真的很困惑!
您可以使用分析函数ROW_NUMBER通过增加/减少子查询中每种产品的销售额来对记录进行排名,然后进行条件汇总:
SELECT
prod product,
MAX(CASE WHEN rn2 = 1 THEN quant END) max_quant,
MAX(CASE WHEN rn2 = 1 THEN cust END) max_cust,
MAX(CASE WHEN rn2 = 1 THEN TO_DATE(year || '-' || month || '-' || day, 'YYYY-MM-DD') END) max_date,
MAX(CASE WHEN rn2 = 1 THEN state END) max_state,
MAX(CASE WHEN rn1 = 1 THEN quant END) min_quant,
MAX(CASE WHEN rn1 = 1 THEN cust END) min_cust,
MAX(CASE WHEN rn1 = 1 THEN TO_DATE(year || '-' || month || '-' || day, 'YYYY-MM-DD') END) min_date,
MAX(CASE WHEN rn1 = 1 THEN state END) min_state,
avg_quant
FROM (
SELECT
s.*,
ROW_NUMBER() OVER(PARTITION BY prod ORDER BY quant) rn1,
ROW_NUMBER() OVER(PARTITION BY prod ORDER BY quant DESC) rn2,
AVG(quant) OVER(PARTITION BY prod) avg_quant
FROM sales s
) x
WHERE rn1 = 1 OR rn2 = 1
GROUP BY prod, avg_quant
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句