SQL 查询:如何通过自己列中的“任何”检索结果?

Posted

技术标签:

【中文标题】SQL 查询:如何通过自己列中的“任何”检索结果?【英文标题】:SQL query: how do results get retrieved via "any" in own columns? 【发布时间】:2013-05-22 16:14:16 【问题描述】:

另一个 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
...

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

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 问题打扰您,我正在努力学习...

【问题讨论】:

【参考方案1】:

使用简单的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 provided for your previous question:您的查询中未定义窗口函数的 OVER 子句 dt

要获得您要求的结果,请查看tablefunc 模块的crosstab() 函数。更多信息在这里:Sum by month and put months as columns

动态列数

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

如果数组而不是单个列对您来说足够好,请查看同一问题的答案by @Clodoaldo,或者,更多解释,请参阅此相关答案中的“共享相同类型的可变列数”一章:Refactor a PL/pgSQL function to return the output of various SELECT queries

【讨论】:

首先,感谢您的帮助。你是对的,我忘记了后面的“()”,因为我没有更多的条款。尽管如此,我还是无法使用交叉表。我还找到了这个站点:postgresonline.com/journal/archives/…,这与您的示例非常相似。但是我不知道如何为动态范围设置交叉表查询(在我的例子中为 element_id)。所有示例都有固定值(例如 Jan、Feb、... Dec)。你能给我一个例子吗?非常感谢 @Anonymous:你的范围有多动态?我在答案中添加了更多内容。

以上是关于SQL 查询:如何通过自己列中的“任何”检索结果?的主要内容,如果未能解决你的问题,请参考以下文章

大查询:如何检索与字段 2 对应的字段 1 中的值

如何从以 BLOB 类型存储在列中的 XML 中提取数据(通过 SQL 查询)

如何最好地从 Java/JDBC 中的 SQL 查询中检索 SELECT COUNT(*) 的结果 - Long?大整数?

SQL查询从两列中检索两个日期之间的数据

SQL查询以从逗号分隔的列中检索值[重复]

如何对两列求和并通过减去它们的聚合 SQL 和 C# 在第三列中显示结果?