簡體   English   中英

如何通過一系列日期獲得價值?

[英]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 APPLYCROSS 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM