[英]Multiple Queries as a Single Query
两个查询
SELECT wavelength, reflectance
FROM
(SELECT
ROW_NUMBER() OVER(ORDER BY NULL) As RowNumber, *
FROM deodar) As foo
WHERE (RowNumber % 5 = 0)
第一个查询结果将作为第二个查询数据的输入以执行操作
SELECT
wavelength,
(LEAD(wavelength) OVER (ORDER BY wavelength) - wavelength) /
(CASE WHEN (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) = 0 THEN 1
ELSE (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) END)
AS reflectance
FROM deodar
执行完操作后,我想显示结果
简单的答案是您可以使用子选择。
SELECT
wavelength,
(LEAD(wavelength) OVER (ORDER BY wavelength) - wavelength) /
(CASE WHEN (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) = 0 THEN 1
ELSE (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) END)
AS reflectance
FROM (
SELECT wavelength, reflectance
FROM
(SELECT
ROW_NUMBER() OVER(ORDER BY NULL) As RowNumber, *
FROM deodar) As foo
WHERE (RowNumber % 5 = 0)
) bar
还不清楚是否要在过滤之前或之后应用LEAD操作。 如果希望在过滤之前应用它们,则可以颠倒嵌套的顺序。
为了进行更复杂的操作或提高可读性/可维护性,PostgreSQL(和最新的ANSI SQL)支持公用表表达式 ,使您可以创建多个虚拟表并从中进行选择。 各个虚拟表可以相互引用,甚至可以互相引用。 Microsoft有一些非常好的文档。
根据所使用的SQL引擎,CTE的性能可能与子选择的性能不同。 在虚拟表仅使用一次的简单情况下,子选择可能会表现更好(如果存在任何性能差异)。
CTE解决方案如下所示:
WITH bar AS (
SELECT wavelength, reflectance
FROM
(SELECT
ROW_NUMBER() OVER(ORDER BY NULL) As RowNumber, *
FROM deodar) As foo
WHERE (RowNumber % 5 = 0)
)
SELECT
wavelength,
(LEAD(wavelength) OVER (ORDER BY wavelength) - wavelength) /
(CASE WHEN (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) = 0 THEN 1
ELSE (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) END)
AS reflectance
FROM bar
SELECT wavelength,reflectance
FROM
(SELECT ROW_NUMBER() OVER(ORDER BY NULL) As RowNumber,* FROM deodar) As foo
WHERE(RowNumber%5=0)
UNION
SELECT wavelength,
(LEAD(wavelength) OVER (ORDER BY wavelength) - wavelength)/
(CASE WHEN (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) = O THEN 1
ELSE (LEAD(reflectance) OVER (ORDER BY wavelength) - reflectance) END)
AS reflectance
FROM deodar
使用UNION
的唯一条件是所有查询必须返回相同的列(类型和名称)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.