带有最新加载时间的Case语句的SQL查询
我有一组非常大的数据,我需要从中为每个可用的时间戳选择特定的标记,但是如果给定标记存在多个时间戳,我需要选择具有最新loadtimestamp的标记 这是我的数据集的简化版本:带有最新加载时间的Case语句的SQL查询,sql,postgresql,Sql,Postgresql,我有一组非常大的数据,我需要从中为每个可用的时间戳选择特定的标记,但是如果给定标记存在多个时间戳,我需要选择具有最新loadtimestamp的标记 这是我的数据集的简化版本: |tag_name | value | time_stamp | loadtimestamp | |:---------:|:-------:|:-----------------:|:-----------------:| | TAG1 | 10 |2017-01-19
|tag_name | value | time_stamp | loadtimestamp |
|:---------:|:-------:|:-----------------:|:-----------------:|
| TAG1 | 10 |2017-01-19 22:16:04|2017-01-19 22:49:58|
| TAG2 | 89 |2017-01-19 22:16:04|2017-01-19 22:49:58|
| TAG3 | 22 |2017-01-19 22:16:04|2017-01-19 22:49:58|
| TAG1 | 12 |2017-01-19 22:17:05|2017-01-19 22:49:58|
| TAG2 | 93 |2017-01-19 22:17:05|2017-01-19 22:49:58|
| TAG3 | 15 |2017-01-19 22:17:05|2017-01-19 22:49:58|
| TAG1 | 9 |2017-01-19 22:16:04|2017-01-22 12:29:12|
| TAG2 | 88 |2017-01-19 22:16:04|2017-01-22 12:29:12|
| TAG3 | 21 |2017-01-19 22:16:04|2017-01-22 12:29:12|
| TAG1 | 15 |2017-01-19 22:18:05|2017-01-19 22:49:58|
| TAG2 | 98 |2017-01-19 22:18:05|2017-01-19 22:49:58|
| TAG3 | 23 |2017-01-19 22:18:05|2017-01-19 22:49:58|
起初,我没有考虑loadtimestamp问题,我的查询如下:
select time_stamp,
MAX(Case when tag_name = 'TAG1' then value else NULL END) as "Tagname 1",
MAX(Case when tag_name = 'TAG2' then value else NULL END) as "Tagname 2",
MAX(Case when tag_name = 'TAG3' then value else NULL END) as "Tagname 3",
from "DATATABLE".calculated_data
group by time_stamp
我使用case语句是因为我需要一种为数据集中的每个标记指定特定名称的方法
结果是在22:16:04,我有多个标签的结果/值。我需要的是,对于每个标记/时间戳,我只有一个值,它是具有最新loadtimestamp的值
我见过几个版本的查询试图提取最新的日期,但我找不到一种方法来应用它,同时也使用case语句
我尝试了几个版本的子查询,但我相信结果是,每次找到标记时,它都会查询整个数据集,寻找相同的标记和时间戳,然后选择具有最新loadtimestamp的一个。由于我的数据集约为5000万行,而生成的表约为100万行,因此这种方法不可行(老实说,我从未让它真正起作用)。我的最终方法需要进行一些优化,以便能够在合理的时间内执行
要明确的是,我对SQL非常陌生,有点不了解,所以如果这过于基本或不清楚,我深表歉意。我将非常感谢在这个问题上的任何帮助或指导
谢谢 卡皮尔的回答很有效。完整查询只需约3分钟
select t.tag_name ,t.time_stamp from
(select tag_name ,time_stamp ,
row_number()over(partition by tag_name,time_stamp order by loadtimestamp
desc) as RN
from calculated_data)t
where t.RN=1
在案例陈述中,最终看起来是这样的:
select t.time_stamp,
MAX(Case when tag_name = 'TAG1' then value else NULL END) as "Tagname 1",
MAX(Case when tag_name = 'TAG2' then value else NULL END) as "Tagname 2",
MAX(Case when tag_name = 'TAG3' then value else NULL END) as "Tagname 3",
from
(select time_stamp, tag_name value,
row_number()over(partition by tag_name , time_stamp, value order by loadtimestamp
desc) as RN
from calculated_data) t
where t.RN = 1
group by t.time_stamp
order by t.time_stamp;
非常感谢你,卡皮尔!