Запись номера группы в SQL - PullRequest
0 голосов
/ 29 мая 2011

У меня есть приложение, которое я не могу изменить.Он должен выполнить SQL GROUP BY, но не может.Однако он может и действительно читает поле GroupNumber из той же таблицы.

Сейчас я выполняю группировку SQL-оператора, обрабатываю его в коде и записываю GroupNumber в таблицу так,это приложение может делать свое дело.Я хотел бы выполнить один оператор SQL, чтобы выполнить группировку и обратную запись за один шаг.Я не могу понять, как это сделать, если это действительно возможно.Простой пример:

  SELECT FirstName, LastName, Age 
    FROM Persons 
   WHERE .... 
GROUP BY Age 
ORDER BY Age

Я выполняю это, затем выполняю

for ( i = 1; i <= result_set.n; i++ )
  Sql = “UPDATE Persons 
            SET GroupNumber  = “ + fixed( i ) 
       + “WHERE Age = “ + fixed( result_set.Age[i] )

Мне нужно делать это каждый раз, когда запись добавляется в таблицу (так что да, если кто-то моложе менядобавляется, номер моей группы меняется - не спрашивайте).

Ответы [ 2 ]

0 голосов
/ 04 мая 2012

Я не совсем уверен, что вы ищете, вот мое лучшее предположение:

;WITH AllRows AS (--get one row per age, and number them
SELECT
    Age, ROW_NUMBER() OVER (PARTITION BY AGE ORDER BY Age) AS RowNumber
    FROM Persons
    WHERE ...
    GROUP BY Age
)
UPDATE p --update all the people, getting their GroupNumber based on their Age's row number
    SET GroupNumber=a.RowNumber
    FROM Persons           p
        INNER JOIN AllRows a ON p.Age=a.Age
    WHERE GroupNumber IS NULL OR GroupNumber!=a.RowNumber

Я использую SQL Server, но это достаточно стандартизированный код.

0 голосов
/ 29 мая 2011

Очевидно, что вы хотите триггер. Однако определения триггеров варьируются от сервера базы данных к серверу базы данных. Я рискну догадаться и скажу, что вы используете какую-то версию Microsoft SQL Server: синтаксис создания триггера и несколько примеров можно найти по адресу http://msdn.microsoft.com/en-us/library/ms189799.aspx.. Возможно, возникнут небольшие сложности с модификацией триггера в той же таблице. он получает данные, но я полагаю, что вы обычно можете сделать это в большинстве баз данных сервера SQL (SQLite может быть одним из немногих, где это сложно).

Попробуйте и посмотрите, поможет ли это.

...