选择每个dense_rank的最后两行

时间:2015-02-27 12:40:08

标签: sql-server row-number

使用MSSQL,我试图从日志中获取一些信息,其中一个事件在另一个事件之后直接发生。

所以我实际上的目的是得到一个由TransactionID划分的行号,然后我需要EACH transactionID的最后2行(最后2行号)(由TxnDate字段排序)。每个TransactionID可以有任意数量的行。

所以我会得到:

JnlId    TxnId    RowNum
5        10001    65
2        10001    66
10       10002    11
8        10002    12
5        10003    15
98       10003    16

任何想法如何实现这一点,因为我不知所措!在此之后的最后一场比赛是过滤掉JnlId'选择少量ID的字段。

有点背影故事。该客户认为他们的员工正在偷窃,因此我需要在完成每笔交易之前直接取消他们取消物品。

3 个答案:

答案 0 :(得分:1)

而不是ascending订单中的排序,请尝试descending订单

select * from 
(
select dense_rank() over(partition by transactionID Order by TxnDate Desc) Rn,*
from yourtable
) A
where rn<=2

答案 1 :(得分:1)

试试这个,我添加了一些额外的行,以使密集排名更加明显:

测试数据:

DECLARE @t table(JnlId int,TxnId int,RowNum int,  TxnDate date)
INSERT @t values
(5, 10001,65, '2015-01-01'),
(2, 10001,66, '2015-01-02'),
(2, 10001,66, '2015-01-03'),
(2, 10001,66, '2015-01-04'),
(2, 10001,67, '2015-01-04'),
(2, 10001,67, '2015-01-04'),
(10,10002,11, '2015-01-03'),
(8, 10002,12, '2015-01-04'),
(5, 10003,15, '2015-01-05'),
(98,10003,16, '2015-01-06')

查询:

;WITH CTE AS
(
  SELECT 
    DENSE_RANK() over(partition by txnID order by TxnDate desc) rn,
    JnlId,  TxnId,  RowNum, TxnDate
  FROM @t
)
SELECT JnlId,  TxnId,  RowNum, TxnDate FROM CTE
WHERE rn<=2

结果:

JnlId  TxnId  RowNum  TxnDate
2      10001  66      2015-01-04
2      10001  67      2015-01-04
2      10001  67      2015-01-04
2      10001  66      2015-01-03
8      10002  12      2015-01-04
10     10002  11      2015-01-03
98     10003  16      2015-01-06
5      10003  15      2015-01-05

答案 2 :(得分:0)

按RowNum降序排序,然后选择ROW_NUMBER少于或等于2的内容

DECLARE @Table TABLE
(
    JnlId INT
    , TxnId INT
    , RowNum INT
);

INSERT INTO @Table
    (JnlId, TxnId, RowNum)
VALUES
    (5, 10001, 65)
    , (2, 10001, 66)
    , (10, 10002, 11)
    , (8, 10002, 12)
    , (5, 10003, 15)
    , (98, 10003, 16);

SELECT T.JnlId, T.TxnId, T.RowNum
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY TxnId ORDER BY RowNum DESC) AS RowNo, *
FROM @Table) AS T
WHERE T.RowNo <=2