我在 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/