SQL обновление сгруппированных данных с приращениями - PullRequest
1 голос
/ 09 декабря 2011

У меня есть таблица со столбцами для [значения обновления], [даты], [времени], [номера телефона] и целочисленного столбца автономного номера / первичного ключа.

Я хочу обновитьтаблица в виде набора, так что она группирует даты и телефонные номера вместе (т. е. если 2 или более записей имеют одинаковую дату и телефон, то они являются частью «группы»), но затем также ставит «1» всамая ранняя запись времени для этой группы, «2» для следующей самой ранней записи времени для этой группы и т. д.

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

Ответы [ 3 ]

2 голосов
/ 09 декабря 2011
UPDATE yt
    SET [update value] = q.RowNum
        FROM YourTable yt
            INNER JOIN (SELECT PKColumn, 
                               ROW_NUMBER() OVER(PARTITION BY [date], [phone number] ORDER BY [time]) AS RowNum
                            FROM YourTable) q
                ON yt.PKColumn = q.PKColumn;

Вы также можете сделать это с CTE :

WITH cteRowNum AS (
    SELECT [update value],
           ROW_NUMBER() OVER(PARTIION BY [date], [phone number] ORDER BY [time]) AS RowNum
        FROM YourTable
)
UPDATE cteRowNum
    SET [update value] = RowNum;
1 голос
/ 09 декабря 2011

Эта строка создаст искомые числа.

ROW_NUMBER() OVER (PARTITION BY [phone number], [date] ORDER BY [date] ASC) Time_Sequencer
1 голос
/ 09 декабря 2011

Посмотрите на функцию ROW_NUMBER (), например,

  SELECT
    Date,
    PhoneNumber,
    Time,
    ROW_NUMBER() OVER (PARTITION BY Date, PhoneNumber ORDER BY Time ASC) AS IndexInGroup
  FROM
    MyTable
...