2011-02-24 14 views
2

我問關於軟件激活情況處理停工問題,其中較老的激活將被鎖定當新激活處理。TSQL得到有序重複的記錄再申請行號

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

我遇到了一個問題,希望有人能提供幫助。讓我們假設的激活表有以下幾列:

客戶名稱,產品名稱,邀請碼,ActivationDate

我需要得到獨特的客戶名稱,產品名稱,並邀請碼數據,你可以多次啓動同一臺機器。結果集需要通過ActivationDate DESC進行排序,以便我可以按激活的順序處理數據。因此,在我的情況下,我可能會允許最後兩次激活工作,所有之前都會登錄到Lockouts表中,以便鎖定新記錄的激活。

我怎樣才能得到一個獨特/不同的結果集排序,然後應用行號,所以我可以遍歷結果集並丟棄最新的激活和與老激活工作,他們鎖定?

謝謝。

回答

0

我認爲這會做你想要什麼:

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 
+0

再次感謝喬! – Neal 2011-02-25 15:21:28

1

我認爲這是你在找什麼對於: 您希望所有行號不是最大的行激活日期

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 
    ) 
+0

它不會碰這兩個:CMP2,遊戲,28736, '11年2月25日8:50' 和CMP1,遊戲,28734, '11年2月25日8:50' – SQLMason 2011-02-25 14:50:58