假设我有一张表:
日期 | 水果 | 状态 | 水果数量 |
---|---|---|---|
2022-01 | 苹果 | 成熟 | 3 |
2022-01 | 香蕉 | 成熟 | 5 |
2022-01 | 梨子 | 成熟 | 10 |
2022-01 | 葡萄 | 成熟 | 9 |
2022-02 | 苹果 | 成熟 | 3 |
2022-02 | 香蕉 | 成熟 | 3 |
2022-02 | 梨子 | 成熟 | 3 |
2022-02 | 葡萄 | 成熟 | 7 |
我想创建一个查询,根据它们的状态
和日期
对水果数量
这一列进行聚合,并添加3个聚合列(AVG, MIN, MAX),按照水果
和日期
排序。表格的输出结果应该是:
日期 | 水果 | 状态 | 数量 | 平均数 | 最大数 | 最小数 |
---|---|---|---|---|---|---|
2022-01 | 苹果 | 成熟 | 3 | 6.5 | 10 | 3 |
2022-01 | 梨子 | 成熟 | 10 | 6.5 | 10 | 3 |
2022-01 | 香蕉 | 成熟 | 5 | 7 | 9 | 5 |
2022-01 | 葡萄 | 成熟 | 9 | 7 | 9 | 5 |
2022-02 | 苹果 | 成熟 | 3 | 3 | 3 | 3 |
2022-02 | 梨子 | 成熟 | 3 | 3 | 3 | 3 |
2022-02 | 香蕉 | 成熟 | 3 | 5 | 7 | 3 |
2022-02 | 葡萄 | 成熟 | 7 | 5 | 7 | 3 |
我感到很困惑,以下是我的进展:
SELECT
date,
fruit,
status,
numberOfFruits,
AVG(CASE WHEN "status" = 'ripe' THEN "numberOfFruits" ELSE "numberOfFruits" END) as AvgNumOfFruits,
MIN(CASE WHEN "status" = 'ripe' THEN "numberOfFruits" ELSE "numberOfFruits" END) as MingNumOfFruits,
MAX(CASE WHEN "status" = 'ripe' THEN "numberOfFruits" ELSE "numberOfFruits" END) as MaxNumOfFruits
FROM fruitdata
GROUP BY 1, 2, 3, 4
ORDER BY date, status
查询仅重复这三个聚合列的numberofFruits。应该是“取具有成熟状态和日期2022-01的列numberOfFruits的平均值,并将其放入一个名为AvgNumOfFruits的新列中。”不知道如何将其转换为SQL。请注意,保留HTML标签。
如有建议/提示/帮助,请提供。谢谢!
avg("numberOfFruits") filter (where status = 'ripe')
,但如果你想要avg()
、min()
和max()
,就无法避免写三个表达式。顺便说一句:你真的应该避免使用那些可怕的带引号的标识符。 - user330315