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
这计算时间差,我得到例如ElementID
1234的结果如下表:
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 查询:如何通过自己列中的“任何”检索结果?的主要内容,如果未能解决你的问题,请参考以下文章
如何从以 BLOB 类型存储在列中的 XML 中提取数据(通过 SQL 查询)
如何最好地从 Java/JDBC 中的 SQL 查询中检索 SELECT COUNT(*) 的结果 - Long?大整数?