使用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的字段。
有点背影故事。该客户认为他们的员工正在偷窃,因此我需要在完成每笔交易之前直接取消他们取消物品。
答案 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