TSQL, чтобы упорядочить записи DISTINCT, а затем применить номера строк - PullRequest
2 голосов
/ 25 февраля 2011

Я задал вопрос о блокировках обработки в сценарии активации программного обеспечения, когда более старые активации блокируются при обработке более новых активаций.

Хранимая процедура SQL Server для выгрузки самых старых X записей при добавлении новых записей

Я столкнулся с проблемой, и, надеюсь, кто-то может помочь. Предположим, таблица активаций имеет следующие столбцы:

CustomerName, ProductName, KeyCode, ActivationDate

Мне нужно получить уникальные данные CustomerName, ProductName и KeyCode, поскольку вы можете активировать один и тот же компьютер несколько раз. ActivationDate DESC должен упорядочить набор результатов, чтобы я мог работать с данными в активированном порядке. Поэтому в моем сценарии я могу разрешить работать двум последним активациям, все до того, как они будут зарегистрированы в таблице блокировок, чтобы они были заблокированы с записью новых активаций.

Как получить упорядоченный уникальный / отличный набор результатов, а затем применить номера строк, чтобы я мог выполнить итерацию набора результатов и отменить последние активации и работать со старыми активациями, чтобы заблокировать их?

Спасибо.

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Я думаю, это то, что вы ищете: Вы хотите, чтобы все строки с номером строки не были максимальными 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
    )
0 голосов
/ 25 февраля 2011

Я думаю, что это будет делать то, что вы хотите:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...