2016-08-30 255 views
0

我想有一种更好的方法可以从row_number中获取最后一行,而不是使用T-SQL进行多重嵌套。使用SQL获取ROW_NUMBER中的最后一行使用SQL

我需要订单总数和最后订购日期。说我有以下几点:

DECLARE @T TABLE (PERSON_ID INT, ORDER_DATE DATE) 
INSERT INTO @T VALUES(1, '2016/01/01') 
INSERT INTO @T VALUES(1, '2016/01/02') 
INSERT INTO @T VALUES(1, '2016/01/03') 
INSERT INTO @T VALUES(2, '2016/01/01') 
INSERT INTO @T VALUES(2, '2016/01/02') 
INSERT INTO @T VALUES(3, '2016/01/01') 
INSERT INTO @T VALUES(3, '2016/01/02') 
INSERT INTO @T VALUES(3, '2016/01/03') 
INSERT INTO @T VALUES(3, '2016/01/04') 

我要的是:

PERSON_ID ORDER_DATE ORDER_CNT 
1   2016-01-03 3 
2   2016-01-02 2 
3   2016-01-04 4 

有没有更好的方式来做到这一点,除了以下:

SELECT * 
    FROM (
    SELECT * 
     , ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY ORDER_CNT DESC) AS LAST_ROW 
     FROM (
     SELECT * 
      , ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY ORDER_DATE) AS ORDER_CNT 
      FROM @T 
     ) AS A 
    ) AS B 
WHERE LAST_ROW = 1 

回答

4

是的,你可以使用这个:

SELECT 
    PERSON_ID, 
    MAX(ORDER_DATE) AS ORDER_DATE, 
    COUNT(*) AS ORDER_CNT 
FROM @T 
GROUP BY PERSON_ID 
2
SELECT a.PERSON_ID 
    , a.ORDER_DATE 
    , a.ORDER_CNT 
FROM 
    (
    SELECT PERSON_ID 
     , ORDER_DATE 
     , rn = ROW_NUMBER() OVER (PARTITION BY PERSON_ID ORDER BY ORDER_DATE DESC) 
     , ORDER_CNT = COUNT(ORDER_DATE) OVER (PARTITION BY PERSON_ID) 
    FROM @T 
    ) AS a 
WHERE rn = 1 
ORDER BY a.PERSON_ID;