从多个字段收集特定指标的最后一个条目

问题描述 投票:0回答:3

背景

我有这张桌子:

时间 公制 A 公制 B 价值
A A A 1
A A B 2
A A C 1
B A A 1
B A B 2
B A C 1

我想获取最后一个并按指标 A 总结表格,但有时时间会变得疯狂,而按时间分组不是一个选项。

我想要的是获取每个指标 A 的指标 B 的最后一个值。有关如何确保获得指标 A 的指标 B 的最后插入值的任何提示?

所需输出

时间 公制 A 公制 B 价值
A A A 1
A A B 2
A A C 1
sql postgresql greatest-n-per-group
3个回答
0
投票

您可以使用rank()或dense_rank()来实现您正在寻找的东西。

create table table1 (
  time timestamp, 
  metric_a varchar(1), 
  metric_b varchar(1), 
  value integer
  );
  
insert into table1 values 
(current_timestamp, 'A','A',1),
(current_timestamp, 'A','B',2),
(current_timestamp, 'A','C',1),
(current_timestamp - interval '10 minutes', 'A','A',1), 
(current_timestamp - interval '10 minutes', 'A','B',2), 
(current_timestamp - interval '10 minutes', 'A','C',1), 
(current_timestamp, 'B','A',2),
(current_timestamp, 'B','B',3),
(current_timestamp, 'B','C',4),
(current_timestamp - interval '10 minutes', 'B','A',2), 
(current_timestamp - interval '10 minutes', 'B','B',3), 
(current_timestamp - interval '10 minutes', 'B','C',4);

select time, metric_a, metric_b, value 
from (
  select *, 
   dense_rank() over (partition by metric_a, metric_b order by time desc) as rnk
  from table1
  )z
where rnk = 1;
时间 公制_a 公制_b 价值
2023-08-14T15:13:49.623Z A A 1
2023-08-14T15:13:49.623Z A B 2
2023-08-14T15:13:49.623Z A C 1
2023-08-14T15:13:49.623Z B A 2
2023-08-14T15:13:49.623Z B B 3
2023-08-14T15:13:49.623Z B C 4

在 DB Fiddle 上查看


0
投票

使用子查询:

select t.* from tbl t where t.time = (select max(t1.time) 
   from tbl t1 where t1.metric_a = t.metric_a and t1.metric_b = t.metric_b)

看小提琴


0
投票

所以基本上你想要每个组合(A,B)的最新行。
简单的

DISTINCT ON
可以做到这一点:

SELECT DISTINCT ON (metric_a, metric_b) *
FROM   tbl
ORDER  BY metric_a, metric_b, time DESC;

小提琴

匹配的多列索引通常对性能非常有用:

CREATE INDEX ON tbl (metric_a, metric_b, TIME DESC);
对于每组

很少
行,DISTINCT ON通常也是最快的。 (这似乎是你的情况。)参见:

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