sql—执行聚合函数时如何检索其他列?

ajsxfq5m  于 2021-07-26  发布在  Java
关注(0)|答案(4)|浏览(371)

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

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也能帮助我理解这个想法。

ttvkxqim

ttvkxqim1#

在标准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
3vpjnl9f

3vpjnl9f2#

你可以用它做你想做的事 distinct on :

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

我找到你的 date 列混乱。它有一个时间成分,所以它的名字有误导性。

mm5n2pyu

mm5n2pyu3#

其他答案更简单、更好,但这里有一个替代方法来解决聚合问题。您可以使用子查询只包含 max 每次询问前,每次询问每次日期的询问量 min 询问每个日期。

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;
uttx8gqw

uttx8gqw4#

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 值按降序排列。
详细说明:
按组选择每组中的第一行?

相关问题