执行聚集函数时如何检索其他列?

问题描述 投票:1回答:4

我一直在尝试从表中检索其他列,在该表中我正在执行聚合函数以按日期获取最小数目,这是数据的示例:

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,弄乱了结果。

问题是:

  1. 如何获得结果中显示的最小ask_volume的相应ask
  2. 并且,如果在同一ask上有两个具有相同date值的记录,如何获得ask_volume以显示一个具有最高值的记录?

我使用PostgreSQL,但是来自其他数据库的SQL也将帮助我理解这个主意。

sql postgresql date greatest-n-per-group
4个回答
0
投票
在标准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


0
投票
您可以用distinct on做您想做的事情:

select distinct on (date) t.* from (select t.*, order by date, ask, ask_volume desc;

我发现您的date列令人困惑。它具有时间成分,因此名称具有误导性。    

0
投票
其他答案更简单,更好,但是这是解决聚合问题的一种替代方法。您可以使用子查询在每个日期获得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;


0
投票
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值。

详细说明:

© www.soinside.com 2019 - 2024. All rights reserved.