sql - 过滤后如何在一个查询中选择第一行和最后一行,然后在一个查询中的两个值的值之间进行计算
问题描述
我正在使用 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'
);
我觉得这段代码很笨拙。它也不会让我通过,因为尚未定义“打开”和“关闭”。
无论如何可以在一次选择中查询这个吗?
谢谢
解决方案
我们可以通过常规查询来处理这个问题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;
推荐阅读
- javascript - 如何从 WordPress 中的 ajax 处理程序调用我主题的 functions.php 中的方法?
- dialogflow-es - Dialogflow 如何在没有语音确认的情况下 DeepLink 启动 Android 应用程序?
- android - 我启用了虚拟化并禁用了 Hyper-V 仍然没有安装 Intel x86 Hmax 硬件
- typescript - 对象文字的“不可分配给类型参数”错误
- node.js - 如何允许节点在 Ubuntu 18.04 上监听 1024 以下的端口?
- c# - 在 ASP.NET Core MVC 的视图中格式化日期
- angular - 使用 Angular 6 在 Highcharts 中进行一般绘图
- php - 将原始数据从 PHP 服务器 API 发送到 Swift 客户端 API
- python-3.x - 创建一个从每个数组中减去的python公式
- java - 使用来自editText android的数据创建Pdf