0

另一个 SQL 问题。我有以下查询:

SELECT EXTRACT(epoch from dt) as diff
from (
     SELECT time_col - lag(time_col) OVER dt
     FROM myTable where elementID=1234
 ) as dt 

这会计算时间差,我得到例如以下ElementID1234 的结果表:

34
345
6
2
...

但是,我想对存储在表中的每个元素 ID 执行此操作elementTable。这是我的方法:

SELECT EXTRACT(epoch from dt) as diff
from (
     SELECT time_col - lag(time_col) OVER dt
     FROM myTable where elementID=any(select elementID from elementTable) 
 ) as dt 

这非常接近想要的结果,但是我将所有内容都放在一个列中。例如

34  <- For element id = 1234
345 <- For element id = 1234
6   <- For element id = 1234
2   <- For element id = 1234
83  <- For element id = x
4   <- For element id = x
6   <- For element id = x
...

我想要的是这个(按元素id在列中排序):

 1234 | x | ...
 ------------------
 34     83  ...
 345    4   ...
 6      6   ...
 2      

很抱歉用我的 SQL 问题打扰您,我正在努力学习...

4

1 回答 1

2

使用简单JOIN而不是复杂的ANY构造:

SELECT element_id
      ,EXTRACT(epoch from (time_col - lag(time_col) OVER (ORDER BY something)))
FROM   tbl
JOIN   elementTable USING (element_id);

此外,您打破了为上一个问题提供的有效解决方案@Clodoaldo:窗口函数的OVER子句dt在您的查询中未定义。

要获得您要求的结果,请查看模块的crosstab()功能。tablefunc更多信息:
按月求和并将月份作为列

动态列数

“动态”使这变得更加困难,因为 SQL 想要事先知道结果列。我在此相关答案中全面介绍了该主题:
Dynamic Alternative to pivot with CASE and GROUP BY

如果一个数组而不是单个列对您来说足够好,请查看@Clodoaldo 对同一问题的答案,或者,为了获得更多解释,请参阅此相关答案中的“共享相同类型的可变列数”一章:
重构 a PL/pgSQL 函数返回各种 SELECT 查询的输出

于 2013-05-22T19:00:10.417 回答