Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有最新加载时间的Case语句的SQL查询_Sql_Postgresql - Fatal编程技术网

带有最新加载时间的Case语句的SQL查询

带有最新加载时间的Case语句的SQL查询,sql,postgresql,Sql,Postgresql,我有一组非常大的数据,我需要从中为每个可用的时间戳选择特定的标记,但是如果给定标记存在多个时间戳,我需要选择具有最新loadtimestamp的标记 这是我的数据集的简化版本: |tag_name | value | time_stamp | loadtimestamp | |:---------:|:-------:|:-----------------:|:-----------------:| | TAG1 | 10 |2017-01-19

我有一组非常大的数据,我需要从中为每个可用的时间戳选择特定的标记,但是如果给定标记存在多个时间戳,我需要选择具有最新loadtimestamp的标记

这是我的数据集的简化版本:

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

非常感谢你,卡皮尔!