我问了一个关于在软件激活场景中处理锁定的问题,在这个场景中,当处理新的激活时,旧的激活被锁定。
SQL Server Stored Procedure to dump oldest X records when new records added
我遇到了一个问题,希望有人能帮上忙。让我们假设Activations表包含以下列:
CustomerName、ProductName、KeyCode、ActivationDate
我需要获取唯一的CustomerName、ProductName和KeyCode数据,因为您可以多次激活同一台机器。结果集需要按ActivationDate DESC排序,以便我可以按激活的顺序处理数据。因此,在我的场景中,我可能会允许最后两个激活工作,所有这些都是在登录到Lockout表之前,这样它们就会被记录的新激活锁定。
如何对唯一/不同的结果集进行排序,然后应用行号,这样我就可以迭代结果集,丢弃最新的激活并使用较旧的激活来锁定它们?
谢谢。
发布于 2011-02-25 06:18:37
我认为这会做你想要的:
select t.CustomerName, t.ProductName, t.KeyCode, t.MaxDate,
row_number() over (order by t.MaxDate desc) as RowNum
from (select CustomerName, ProductName, KeyCode, max(ActivationDate) as MaxDate
from Activations
group by CustomerName, ProductName, KeyCode) t它也可以使用CTE编写,如下所示:
;with cteMaxDate as (
select CustomerName, ProductName, KeyCode, max(ActivationDate) as MaxDate
from Activations
group by CustomerName, ProductName, KeyCode
)
select t.CustomerName, t.ProductName, t.KeyCode, t.MaxDate,
row_number() over (order by t.MaxDate desc) as RowNum
from cteMaxDate t发布于 2011-02-25 22:49:39
我认为这就是您要找的:您想要行号不是最大ActivationDate的所有行
DECLARE @tbl TABLE
(
CustomerName VARCHAR(20),
ProductName VARCHAR(20),
KeyCode INT,
ActivationDate DATETIME
)
INSERT INTO @tbl
SELECT 'cmp1', 'game', 28734, GETDATE() -1 UNION ALL
SELECT 'cmp1', 'game', 28734, GETDATE() -1.5 UNION ALL
SELECT 'cmp1', 'game', 28734, GETDATE() -1.2 UNION ALL
SELECT 'cmp1', 'game', 28734, GETDATE() -1.8 UNION ALL
SELECT 'cmp1', 'game', 28734, GETDATE() UNION ALL
SELECT 'cmp1', 'game', 28734, GETDATE() -17 UNION ALL
SELECT 'cmp2', 'game', 28736, GETDATE() -1 UNION ALL
SELECT 'cmp2', 'game', 28736, GETDATE() -1.5 UNION ALL
SELECT 'cmp2', 'game', 28736, GETDATE() -1.2 UNION ALL
SELECT 'cmp2', 'game', 28736, GETDATE() -1.8 UNION ALL
SELECT 'cmp2', 'game', 28736, GETDATE() UNION ALL
SELECT 'cmp2', 'game', 28736, GETDATE() -17
SELECT ROW_NUMBER() OVER(ORDER BY ActivationDate DESC) RowNumber,
CustomerName,
ProductName,
KeyCode,
ActivationDate
FROM @tbl workTable
WHERE ActivationDate !=
(
SELECT MAX(ActivationDate)
FROM @tbl checkTable
WHERE workTable.CustomerName = checkTable.CustomerName
AND workTable.ProductName = checkTable.ProductName
AND workTable.KeyCode = checkTable.KeyCode
)RowNumber CustomerName ProductName KeyCode ActivationDate
1 cmp1 game 28734 2011-02-24 08:40:45.790
2 cmp2 game 28736 2011-02-24 08:40:45.790
3 cmp2 game 28736 2011-02-24 03:52:45.793
4 cmp1 game 28734 2011-02-24 03:52:45.793
5 cmp1 game 28734 2011-02-23 20:40:45.790
6 cmp2 game 28736 2011-02-23 20:40:45.790
7 cmp2 game 28736 2011-02-23 13:28:45.790
8 cmp1 game 28734 2011-02-23 13:28:45.790
9 cmp1 game 28734 2011-02-08 08:40:45.790
10 cmp2 game 28736 2011-02-08 08:40:45.790如果你想要更多...
SELECT ROW_NUMBER() OVER(ORDER BY ActivationDate DESC) RowNumber,
CustomerName,
ProductName,
KeyCode,
ActivationDate
FROM @tbl workTable
WHERE NOT ActivationDate IN
(
SELECT TOP 2 ActivationDate
FROM @tbl checkTable
WHERE workTable.CustomerName = checkTable.CustomerName
AND workTable.ProductName = checkTable.ProductName
AND workTable.KeyCode = checkTable.KeyCode
ORDER BY ActivationDate DESC
)https://stackoverflow.com/questions/5111048
复制相似问题