我一直在尝试从表中检索其他列,在该表中我正在执行聚合函数以按日期获取最小数目,这是数据的示例:
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
1具有相同的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也将帮助我理解这个主意。
select *
from (
select t.*, row_number() over(partition by date order by ask, ask_volume desc) rn
from mytable
) t
where rn = 1
在Postgres中,这更适合distinct on
:
select distinct on (date) * from mytable order by ask, ask_volume desc
distinct on
做您想做的事情:select distinct on (date) t.*
from (select t.*,
order by date, ask, ask_volume desc;
我发现您的date
列令人困惑。它具有时间成分,因此名称具有误导性。
max
询问之前只在每个询问的每个日期包含min
ask_volume。select date, min(ask), max(ask_volume)
from t
where (date, ask_volume) in (select date, max(ask_volume)
from t
group by date, ask)
group by date;
DISTINCT ON
已经被提出,但是方式不完善。 (当前接受的答案不正确。)这就是您的方法:SELECT DISTINCT ON (date) *
FROM tbl
ORDER BY date, ask, ask_volume DESC NULLS LAST;
最重要的是,ORDER BY
中的前导表达式必须在DISTINCT ON
中的表达式集中。换句话说,对于简单情况,date
必须是第一个ORDER BY
表达式。虽然尚未排除
null
值(具有NOT NULL
约束),但您必须先添加NULLS LAST
或以降序先获取null
值。详细说明: