簡體   English   中英

通過根據條件對SQL Server進行排名和分組來查詢

[英]SQL server query by ranking and grouping based upon conditions

我正在嘗試創建一個SQL查詢,該查詢將根據創建的日期對記錄進行排名,然后在記錄交互(請求和響應)的表中按eventId分組

將從創建的響應日期-創建的請求日期中得出日期計算,但是可能有多個響應和請求實例

  1. 請求
  2. 響應-響應(2)和請求(1)之間的DateDiff
  3. 索取更多詳細信息
  4. 響應-響應(4)和請求(3)之間的DateDiff

我已經設法完成了第一部分,即識別事件並對其進行排序,但是無法確定如何進行分組。 請參閱下面的查詢和結果集:

WITH rows
AS (
    SELECT ID,
        IncidentId,
        Cust,
        Channel,
        TTypeID,
        DateCreated,
        RANK() OVER (PARTITION BY IncidentId ORDER BY Id) AS 'rownum',
        ROW_NUMBER() OVER (PARTITION BY IncidentId ORDER BY DateCreated) AS Counts
    FROM [dbo].[Thread]
    WHERE TypeId IN (3, 4, 2, 1)
    )
SELECT *
FROM (
    SELECT DISTINCT a.ID,
        a.incidentId,
        a.Channel,
        a.rownum,
        a.TypeID,
        a.datecreated
    FROM rows a
    JOIN rows b
        ON a.incidentId = b.incidentId
    WHERE a.TypeId IN (3, 4, 2)
    ) AS base



 ID Incident           Channel          Rownum  Type    DateCreated
 24108571   9436560     Form            1       3           2015-04-22 13:41:29.000
 24109189   9436560     E-mail          2       2           2015-04-22 13:48:21.000
 24109788   9436560     Form            3       3           2015-04-22 13:49:39.000
 24109789   9436560     Email           4       2           2015-04-22 13:50:37.000

我希望能夠再次對結果進行排名,以便確定請求響應的數量。

輸出應如下所示:

   ID       Incident           Channel      Rownum      Type                DateCreated             WaitTimeGrouping
 24108571   9436560         Form            1       3           2015-04-22 13:41:29.000             0
 24109189   9436560         E-mail          2       2           2015-04-22 13:48:21.000             1
 24109788   9436560         Form            3       3           2015-04-22 13:49:39.000                0
 24109789   9436560         Email           4       2           2015-04-22 13:50:37.000             2

一個選擇入門的示例如下所示:

SELECT
    req.Incident,
    MAX( resp.DateCreated - req.DateCreated ),
    MIN( resp.DateCreated - req.DateCreated ),
    AVG( resp.DateCreated - req.DateCreated )
FROM Thread req
INNER JOIN Thread resp
    ON req.Incident = resp.Incident
    AND resp.Rownum = req.RowNum+1
WHERE req.Type = 3 -- "Request"?
AND resp.Type = 2 -- "Response"?
GROUP BY req.Incident

注意,我們只是假設響應的Rownum始終是請求的Rownum +1。 如果不能保證這一點,則需要另一個(子)查詢來找到請求和響應記錄之間的匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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