我一直在尝试从一个表中检索其他列,在该表中我正在执行聚合函数以按日期获取最小值,以下是数据示例:
id resource date quality ask ask_volume
1 1 2020-06-08 10:50 0 6.9 5102
2 1 2020-06-08 10:50 1 6.8 2943
3 1 2020-06-08 10:50 2 6.9 25338
4 1 2020-06-08 10:50 3 7.0 69720
5 1 2020-06-08 10:50 4 7.0 9778
6 1 2020-06-08 10:50 5 7.0 297435
7 1 2020-06-08 10:40 0 6.6 611
8 1 2020-06-08 10:40 1 6.6 4331
9 1 2020-06-08 10:40 2 6.7 1000
10 1 2020-06-08 10:40 3 7.0 69720
11 1 2020-06-08 10:40 4 7.0 9778
12 1 2020-06-08 10:40 5 7.0 297435
...
这是我想要得到的结果,所以我可以对它进行加权平均:
date ask ask_volume
2020-06-08 10:50 6.8 2943
2020-06-08 10:40 6.6 4331
...
尽管两者都有 quality
0和 quality
我有同样的 ask
, quality
选择1是因为 ask_volume
更高。
我试过经典的:
SELECT date, min(ask) FROM table GROUP BY date;
但是添加 ask_volume
列列表将强制我将其添加到 GROUP BY
还有,把结果搞砸了。
问题是:
如何获得相应的 ask_volume
最小值的 ask
在结果中显示?
如果有两个记录具有相同的 ask
价值相同 date
,我怎样才能 ask_volume
显示最高值的那个?
我使用postgresql,但是来自不同数据库的sql也能帮助我理解这个想法。
4条答案
按热度按时间ttvkxqim1#
在标准sql中,您将使用窗口函数:
在postgres中,这更适合于
distinct on
:3vpjnl9f2#
你可以用它做你想做的事
distinct on
:我找到你的
date
列混乱。它有一个时间成分,所以它的名字有误导性。mm5n2pyu3#
其他答案更简单、更好,但这里有一个替代方法来解决聚合问题。您可以使用子查询只包含
max
每次询问前,每次询问每次日期的询问量min
询问每个日期。uttx8gqw4#
DISTINCT ON
已经有人提出了,但方式不完美(当前接受的答案是不正确的。)您就是这样做的:最重要的是,在
ORDER BY
必须在中的表达式集中DISTINCT ON
. 换言之,对于简单的情况,date
一定是第一个ORDER BY
表情。而
null
没有排除值(带有NOT NULL
约束),必须添加NULLS LAST
或者得到null
值按降序排列。详细说明:
按组选择每组中的第一行?