选择MIN&之间的第二(中)行SQL Server

时间:2015-11-28 06:58:37

标签: sql sql-server

我有下表:

TicketNumber           CallDate
--------------------------------------------
101                    10/09/2015 3:15:43 PM
101                    10/09/2015 3:45:43 PM
101                    11/19/2015 2:23:09 PM 

我想选择最小日期,中间日期和最长日期。使用MIN和MAX可以轻松获得第一个和最后一个日期。但是如何选择(获取)第二个日期?

SELECT 
    TicketNumber
    , MIN(CallDate) CallDate1
    , MAX(CallDate) CallDate3
    , COUNT(TicketNumber) [Count]
FROM Table1
WHERE -(conditions)-
GROUP BY TicketNumber
HAVING COUNT(TicketNumber)=3

MIN和之间MAX语句中的SELECT日期我希望第二行日期。

预期输出应为:

TicketNumber   CallDate1              CallDate2             CallDate3                Count
------------------------------------------------------------------------------------------
101            10/9/2015 3:15:43 PM  10/9/2015 3:45:43 PM   11/19/2015 2:23:09 PM    3     

2 个答案:

答案 0 :(得分:2)

这是一种可能的变体。首先是编号并计算所有行,然后只过滤那些有三张票并TicketNumbers结果的PIVOT

SQL Fiddle

示例数据

DECLARE @Tickets TABLE (TicketNumber int, CallDate datetime2(0));

INSERT INTO @Tickets (TicketNumber, CallDate) VALUES
(101, '2015-10-09 03:15:43'),
(101, '2015-10-09 03:45:43'),
(101, '2015-11-19 02:23:09'),

(102, '2015-11-20 02:23:09'),
(102, '2015-11-19 02:23:09'),
(102, '2015-11-21 02:23:09'),

(103, '2015-11-10 02:23:09'),
(103, '2015-11-19 02:23:09'),

(104, '2015-11-11 02:23:09'),
(104, '2015-11-01 02:23:09'),
(104, '2015-11-21 02:23:09'),
(104, '2015-11-30 02:23:09');

<强>查询

WITH
CTE
AS
(
    SELECT
        TicketNumber
        ,CallDate
        ,ROW_NUMBER() OVER (PARTITION BY TicketNumber ORDER BY CallDate) AS rn
        ,COUNT(*) OVER (PARTITION BY TicketNumber) AS cnt
    FROM
        @Tickets AS T
)
SELECT
    P.TicketNumber
    ,[1] AS CallDate1
    ,[2] AS CallDate2
    ,[3] AS CallDate3
    ,cnt
FROM
    CTE
    PIVOT (MIN(CTE.CallDate) FOR rn IN ([1], [2], [3])) AS P
WHERE cnt = 3
ORDER BY P.TicketNumber;

<强>结果

+--------------+---------------------+---------------------+---------------------+-----+
| TicketNumber |      CallDate1      |      CallDate2      |      CallDate3      | cnt |
+--------------+---------------------+---------------------+---------------------+-----+
|          101 | 2015-10-09 03:15:43 | 2015-10-09 03:45:43 | 2015-11-19 02:23:09 |   3 |
|          102 | 2015-11-19 02:23:09 | 2015-11-20 02:23:09 | 2015-11-21 02:23:09 |   3 |
+--------------+---------------------+---------------------+---------------------+-----+

答案 1 :(得分:0)

这可以使用表格JOINS来实现。

SELECT t1.TicketNumber, t2.CallDate1, t1.CallDate AS CallDate2, t2.CallDate3, t2.Count
FROM tickets AS t1 
JOIN (
     SELECT TicketNumber, MIN(CallDate) AS CallDate1, MAX(CallDate) AS CallDate3,
     COUNT(TicketNumber) AS Count
     FROM tickets
     GROUP BY TicketNumber
     HAVING COUNT(TicketNumber)=3
    ) AS t2
ON t1.TicketNumber = t2.TicketNumber
WHERE t1.CallDate > t2.CallDate1
AND t1.CallDate < t2.CallDate3

<强> Working Fiddle