SQL: без курсора, как выбрать записи, делающие уникальный целочисленный идентификатор (идентичность как) для дублирования? - PullRequest
1 голос
/ 19 мая 2010

Если у вас есть оператор выбора ниже, где PK является первичным ключом:

select  distinct dbo.DateAsInt( dateEntered) * 100 as PK, 
                 recordDescription as Data
from    MyTable

и вывод выглядит примерно так (первые цифры разделены для ясности):

      PK             Data
2010 01 01 00    New Years Day
2010 01 01 00    Make Resolutions
2010 01 01 00    Return Gifts
2010 02 14 00    Valentines day
2010 02 14 00    Buy flowers

и вы хотите вывести что-то вроде этого:

      PK             Data
2010 01 01 01    New Years Day
2010 01 01 02    Make Resolutions
2010 01 01 03    Return Gifts
2010 02 14 01    Valentines day
2010 02 14 02    Buy flowers

Можно ли заставить "00" в ПК иметь эффект "идентификационного номера" в течение одного выбора? Иначе, как вы можете увеличить число на 1 для каждого найденного действия на эту дату?

Я уже думаю, когда набираю текст, чтобы попробовать что-то вроде Sum (случай, когда 1 затем заканчивается) с группой по.

Редактировать: (Ответ предоставлен JohnFX ниже)

Это был окончательный ответ:

select    PK + row_number() over 
          (PARTITION BY eventid order by eventname) as PK,
          recordDescription
from      (select   distinct  -- Removes row counts of excluded rows)
                    dbo.DateAsInt( dateEntered) as PK,
                    recordDescription as Data
           from     MyTable) A
order by eventid, recordDescription

Ответы [ 2 ]

3 голосов
/ 19 мая 2010

Я думаю, что вы ищете ROW_NUMBER и соответствующее предложение PARTITION.

SELECT DISTINCT dbo.DateAsInt(DateEntered) * 100 as PK, 
                 ROW_NUMBER() OVER (PARTITION BY DateEntered ORDER BY recordDescription) as rowID,
                 recordDescription as Data
FROM MyTable

Если DateEntered имеет повторяющиеся значения, вы, вероятно, также захотите проверить DENSE_RANK () и RANK () в зависимости от ваших конкретных потребностей в том, что делать с инкрементором в этих случаях.

2 голосов
/ 19 мая 2010

Столбцы Datetime никогда не должны использоваться в качестве первичного ключа. Кроме того, если бы у вас был столбец неопределенности, вы не могли бы иметь:

      PK             Data 
2010 01 01 01    New Years Day 
2010 01 01 02    Make Resolutions 
2010 01 01 03    Return Gifts 
2010 02 14 01    Valentines day 
2010 02 14 02    Buy flowers 

Поскольку 2010 01 01 01 будет иметь ту же идентичность, что и 2010 02 14 01.

Наилучшим подходом было бы разделить столбец идентификаторов, указать дату вашего отпуска в другом столбце и объединить преобразованное в nvarchar значение каждого из этих полей.

...