首页 > 解决方案 > 过滤后如何在一个查询中选择第一行和最后一行,然后在一个查询中的两个值的值之间进行计算

问题描述

我正在使用 T-SQL 2014

假设我有一个如下的股价图表 在此处输入图像描述

我想为存储函数编写有效的代码,以显示开始时的开盘价、结束时的收盘价以及收盘价和开盘价之间的差异。是否可以在一个查询中做到这一点?查询看起来很简单,但结果却非常困难。我的第一个问题是在一个查询中显示第一行和最后一行。

我的尝试是这样的

create function GetVolatilityRank(@from date, @to date)
returns table as
return(
with Price_Selected_Time as (select * from Price where [date] between @from and @to)
select
    (select top 1([Open]) from Price_Selected_Time) as 'Open',
    (select top 1([Close]) from Price_Selected_Time order by date desc) as 'Close',
    [Close] - [Open] as 'Difference'
);

我觉得这段代码很笨拙。它也不会让我通过,因为尚未定义“打开”和“关闭”。

无论如何可以在一次选择中查询这个吗?

谢谢

标签: sql

解决方案


我们可以通过常规查询来处理这个问题ROW_NUMBER

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY Date) rn_start,
        ROW_NUMBER() OVER (ORDER BY Date DESC) rn_end
    FROM Price
)

SELECT
    MAX(CASE WHEN rn_start = 1 THEN [Open] END) AS OpenStart,
    MAX(CASE WHEN rn_end = 1 THEN [Close] END) AS CloseEnd,
    MAX(CASE WHEN rn_end = 1 THEN [Close] END) -
        MAX(CASE WHEN rn_start = 1 THEN [Open] END) AS diff
FROM cte;

推荐阅读