sql-server - SQL Server : group by date time and first_value

标签 sql-server azure

我在 SQL Azure 数据库中有一个不同时期的汇率表。

如:

  1. USD-AUD, 2015-1-1 00:01, 0.70 
     2. USD-AUD, 2015-1-1 00:02, 0.73  
     3. USD-AUD, 2015-1-1 00:03, 0.69  
     4. USD-AUD, 2015-1-1 00:04, 0.78  
     5. USD-AUD, 2015-1-1 00:05, 0.75
     6. USD-AUD, 2015-1-1 00:06, 0.80

(Pair, DateTime, ExchangeRate)

我想以 5 分钟为间隔进行分组,并显示最小速率、最大速率以及第一个(第 1 行)和最后一个(第 5 行)。因此开盘价为 0.70,最高价 = 0.78,最低价 = 0.69,收盘价为 0.75

我在这里关注了一些关于如何分组的线程,这些线程很有帮助,但我不知道如何获得“打开”和“关闭”

Select min(price) as low, max(price) as high
from exchangetable
(GROUP BY DATEPART(YEAR, [Time]),
    DATEPART(MONTH, [Time]),
    DATEPART(DAY, [Time]),
    DATEPART(HOUR, [Time])
    GROUP BY DATEPART(mi, [Time]) % 5

使用FIRST_VALUE http://www.mssqltips.com/sqlservertip/2640/sql-server-2012-functions--firstvalue-and-lastvalue/我收到“此版本的 SQL 不支持错误”

解决方案是连接到自身还是游标?

最佳答案

不需要光标。尝试以下操作。请注意,我必须更改不一致的列名称。此外,您还需要 GROUP BY 中的整数除法而不是模运算符 (%)。打开和关闭列由子选择生成。

SELECT
  DATEPART(YEAR,  e1.[datetime]) AS Year,
  DATEPART(MONTH, e1.[datetime]) AS Month,
  DATEPART(DAY,   e1.[datetime]) AS Day,
  DATEPART(HOUR,  e1.[datetime]) AS Hour,
  DATEPART(mi,    e1.[datetime])/5 AS TimeBracket,
  (
    SELECT TOP 1 
      e2.ExchangeRate 
     FROM 
       exchangetable e2 
     WHERE 
       DATEPART(YEAR,  e1.[datetime])   = DATEPART(YEAR,  e2.[datetime]) AND
       DATEPART(MONTH, e1.[datetime])   = DATEPART(MONTH, e2.[datetime]) AND
       DATEPART(DAY,   e1.[datetime])   = DATEPART(DAY,   e2.[datetime]) AND
       DATEPART(HOUR,  e1.[datetime])   = DATEPART(HOUR,  e2.[datetime]) AND
       DATEPART(MI,    e1.[datetime])/5 = DATEPART(MI,    e2.[datetime])/5
     ORDER BY
       [datetime]     
  ) AS [Open],
  (
    SELECT TOP 1 
      e2.ExchangeRate 
     FROM 
       exchangetable e2 
     WHERE 
       DATEPART(YEAR,  e1.[datetime])   = DATEPART(YEAR,  e2.[datetime]) AND
       DATEPART(MONTH, e1.[datetime])   = DATEPART(MONTH, e2.[datetime]) AND
       DATEPART(DAY,   e1.[datetime])   = DATEPART(DAY,   e2.[datetime]) AND
       DATEPART(HOUR,  e1.[datetime])   = DATEPART(HOUR,  e2.[datetime]) AND
       DATEPART(MI,    e1.[datetime])/5 = DATEPART(MI,    DATEADD(MI, -1, e2.[datetime]))/5
     ORDER BY
       [datetime] DESC
  ) AS [Close],
  MIN(ExchangeRate) AS low,
  MAX(ExchangeRate) AS high
FROM
  exchangetable e1
GROUP BY 
  DATEPART(YEAR,  [datetime]),
  DATEPART(MONTH, [datetime]),
  DATEPART(DAY,   [datetime]),
  DATEPART(HOUR,  [datetime]),
  DATEPART(mi,    [datetime])/5

哦,顺便说一句,我需要添加一个小时日期部分,否则您会发现一天中不同部分的“TimeBrackets”聚集在一起。您的数据通过此查询生成以下结果:

Year    Month   Day Hour    TimeBracket Open    Close   low    high
2015    1        1    0     0           0.70    0.75    0.69    0.78
2015    1        1    0     1           0.75    0.80    0.75    0.80

关于sql-server - SQL Server : group by date time and first_value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30044098/

相关文章:

sql-server - 如何在 SQL Server 2000 中从用户定义的函数调用存储过程

asp.net-mvc - 如何在 Azure 上运行 Excel?

azure - 在 Xaramin 和 Azure 通知中心注册用户标签

sql-server - 在 SQL Server 上回滚转换和解锁表

sql - NOT IN with Nulls - 不明确的行为

sql-server - 如何使用 SSIS 将查询结果集作为电子邮件附件发送?

c# - 在 For 循环内使用 IF 条件检查时如何丢弃数据表中的空值

azure - 如何使用 Nginx 和 Microsoft Azure AD 进行身份验证?

azure - 如何在 Azure Synapse Analytics 中为管道设置白天和夜间触发器

powershell - 如何将 Microsoft 帐户添加到 Azure Active Directory?