首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSQL用于对不同的记录进行排序,然后应用行号

TSQL用于对不同的记录进行排序,然后应用行号
EN

Stack Overflow用户
提问于 2011-02-25 06:02:29
回答 2查看 2.2K关注 0票数 2

我问了一个关于在软件激活场景中处理锁定的问题,在这个场景中,当处理新的激活时,旧的激活被锁定。

SQL Server Stored Procedure to dump oldest X records when new records added

我遇到了一个问题,希望有人能帮上忙。让我们假设Activations表包含以下列:

CustomerName、ProductName、KeyCode、ActivationDate

我需要获取唯一的CustomerName、ProductName和KeyCode数据,因为您可以多次激活同一台机器。结果集需要按ActivationDate DESC排序,以便我可以按激活的顺序处理数据。因此,在我的场景中,我可能会允许最后两个激活工作,所有这些都是在登录到Lockout表之前,这样它们就会被记录的新激活锁定。

如何对唯一/不同的结果集进行排序,然后应用行号,这样我就可以迭代结果集,丢弃最新的激活并使用较旧的激活来锁定它们?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-25 06:18:37

我认为这会做你想要的:

代码语言:javascript
复制
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编写,如下所示:

代码语言:javascript
复制
;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
票数 0
EN

Stack Overflow用户

发布于 2011-02-25 22:49:39

我认为这就是您要找的:您想要行号不是最大ActivationDate的所有行

代码语言:javascript
复制
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
    )

代码语言:javascript
复制
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

如果你想要更多...

代码语言:javascript
复制
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
    )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5111048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档