我有这张桌子:
时间 | 公制 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 |
您可以使用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 |
使用子查询:
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)
所以基本上你想要每个组合(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
通常也是最快的。 (这似乎是你的情况。)参见: