[英]How to get value by a range of dates?
我有一張這樣的桌子
使用此代碼,我獲得每個domainId的5個最新值
;WITH grp AS
(
SELECT DomainId, [Date],Passed, DatabasePerformance,ServerPerformance,
rn = ROW_NUMBER() OVER
(PARTITION BY DomainId ORDER BY [Date] DESC)
FROM dbo.DomainDetailDataHistory H
)
SELECT g.DomainId, g.[Date],g.Passed, g.ServerPerformance, g.DatabasePerformance
FROM grp g
INNER JOIN @Latest T ON T.DomainId = g.DomainId
WHERE rn < 7 AND t.date != g.[Date]
ORDER BY DomainId, [Date] DESC
我想要的是
好吧,我想知道這5個最新行中每個都賣了多少票,但條件如下:
這些行中的每一行都有自己的日期,這些日期不同。 對於每個日期,我想查看過去15分鍾內售出的數量以及過去30分鍾售出的數量。
例:
我為每個domainId獲得了這5行
我想擴展上面的兩列,“soldTicketsLast15”和“soldTicketsLast30”
日期欄包含我需要的所有日期,並且對於每個日期我想回去15分鍾並返回30分鍾並獲得售出的票數
例:
SELECT MAX(SoldTickets) FROM DomainDetailDataHistory
WHERE [Date] >= DATEADD(minute, -15, '2016-04-12 12:10:28.2270000')
SELECT MAX(SoldTickets) FROM DomainDetailDataHistory
WHERE [Date] >= DATEADD(minute, -30, '2016-04-12 12:10:28.2270000')
我怎么能做到這一點?
我會使用OUTER APPLY
或CROSS APPLY
。
;WITH grp AS
(
SELECT
DomainId, [Date], Passed, DatabasePerformance, ServerPerformance,
rn = ROW_NUMBER() OVER (PARTITION BY DomainId ORDER BY [Date] DESC)
FROM dbo.DomainDetailDataHistory H
)
SELECT
g.DomainId, g.[Date],g.Passed, g.ServerPerformance, g.DatabasePerformance
,A15.SoldTicketsLast15
,A30.SoldTicketsLast30
FROM
grp g
INNER JOIN @Latest T ON T.DomainId = g.DomainId
OUTER APPLY
(
SELECT MAX(H.SoldTickets) - MIN(H.SoldTickets) AS SoldTicketsLast15
FROM DomainDetailDataHistory AS H
WHERE
H.DomainId = g.DomainId AND
H.[Date] >= DATEADD(minute, -15, g.[Date])
) AS A15
OUTER APPLY
(
SELECT MAX(H.SoldTickets) - MIN(H.SoldTickets) AS SoldTicketsLast30
FROM DomainDetailDataHistory AS H
WHERE
H.DomainId = g.DomainId AND
H.[Date] >= DATEADD(minute, -30, g.[Date])
) AS A30
WHERE
rn < 7
AND T.[date] != g.[Date]
ORDER BY DomainId, [Date] DESC;
要使相關的APPLY
查詢有效,應該有適當的索引,如下所示:
CREATE NONCLUSTERED INDEX [IX_DomainId_Date] ON [dbo].[DomainDetailDataHistory]
(
[DomainId] ASC,
[Date] ASC
)
INCLUDE ([SoldTickets])
此索引還可以幫助您使查詢的主要部分( grp
)高效。
如果我正確地理解了您的問題,您希望從您的某個日期(在日期列中)獲得售票時間為15分30分鍾。 假設您正確使用DATEADD函數,以下內容應該有效:
SELECT MAX(SoldTickets) FROM DomainDetailDataHistory
WHERE [Date] BETWEEN [DATE] AND DATEADD(minute, -15, '2016-04-12 12:10:28.2270000') GROUP BY [SoldTickets]
between運算符允許您檢索兩個日期參數之間的結果。 在上面的SQL中,我們還需要一個組,因為您使用的是GROUPING函數(MAX)。 小組依賴於你想要分組的內容,但我認為在你的情況下它將是SoldTickets。
上面的SQL將為您提供日期和15分鍾之間的SQL。 30分鍾后你可以做類似的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.