SQL: Как добавить столбец идентификатора на основе другого столбца в запросе выбора? - PullRequest
0 голосов
/ 05 июля 2018

Ниже приведено приближение к моему набору данных

DataSetName Date        Sname    Level     Frequency    SetId   ScenarioId  FrequencyId
   Set A    01/31/1980  Base     64,007     Monthly       49    1           2
   Set A    02/29/1980  Base     64,014     Monthly       49    1           2
   Set A    03/31/1980  Stress   64,015     Monthly       49    2           2
   Set A    04/30/1980  Stress   64,008     Monthly       49    2           2
   Set B    05/31/1980  Storm    63,993     Monthly       54    5           2
   Set B    06/30/1980  Raptor   63,972     Monthly       54    24          2
   Set B    07/31/1980  Agile    63,788     Monthly       54    25          2
   Set B    08/31/1980  Pond     63,868     Monthly       54    27          2
   Set B    07/31/1980  Agile    63,212     Monthly       54    25          2

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

Я пытался использовать функцию row_number

Select a.*,ROW_NUMBER() OVER(PARTITION BY Sname Order by DataSetName) 
as S_row_id from Table1

Я также пытался использовать подзапрос

 Select Top 100 a.*,b.S_Row_Id
 from Table1 a
 Left join
 ( Select Distinct Sname,ROW_NUMBER() OVER(PARTITION BY Sname 
 Order by Sname) as Scenario_Row_Id from Table1)b
 on a.ScenarioName=b.ScenarioName

Ни один из них не дает мне выход, который я ищу, который будет выглядеть примерно так

DataSetName Date        Sname    Level     Frequency    SetId   S_row_id    FrequencyId
   Set A    01/31/1980  Base     64,007     Monthly       49    1           2
   Set A    02/29/1980  Base     64,014     Monthly       49    1           2
   Set A    03/31/1980  Stress   64,015     Monthly       49    2           2
   Set A    04/30/1980  Stress   64,008     Monthly       49    2           2
   Set B    05/31/1980  Storm    63,993     Monthly       54    3           2
   Set B    06/30/1980  Raptor   63,972     Monthly       54    4           2
   Set B    07/31/1980  Agile    63,788     Monthly       54    5           2
   Set B    08/31/1980  Pond     63,868     Monthly       54    6           2
   Set B    07/31/1980  Agile    63,212     Monthly       54    5           2
   Set B    07/31/1980  Pond     63,457     Monthly       54    6           2

Что я могу сделать для достижения этого набора результатов, когда Sname автоматически получает назначенный ИД сценария в инкрементном порядке при каждом запуске. Дайте мне знать, если вам нужны подробности мроу?

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Вы можете использовать apply:

select a.*, t2.S_row_id
from Table1 t1 cross apply 
     ( select count(distinct t2.sname) as S_row_id
       from table1 t2
       where t2.sname = t1.sname and
             t2.Date <= t1.date
     ) t2;
0 голосов
/ 05 июля 2018

Почему не функция DENSE_RANK ?

with
  t as(
    select * from (values
      ('Set A', '01/31/1980', 'Base', 64.007, 'Monthly', 49, 1, 2),
      ('Set A', '02/29/1980', 'Base', 64.014, 'Monthly', 49, 1, 2),
      ('Set A', '03/31/1980', 'Stress', 64.015, 'Monthly', 49, 2, 2),
      ('Set A', '04/30/1980', 'Stress', 64.008, 'Monthly', 49, 2, 2),
      ('Set B', '05/31/1980', 'Storm', 63.993, 'Monthly', 54, 5, 2),
      ('Set B', '06/30/1980', 'Raptor', 63.972, 'Monthly', 54, 24, 2),
      ('Set B', '07/31/1980', 'Agile', 63.788, 'Monthly', 54, 25, 2),
      ('Set B', '08/31/1980', 'Pond', 63.868, 'Monthly', 54, 27, 2),
      ('Set B', '07/31/1980', 'Agile', 63.212, 'Monthly', 54, 25, 2),
      ('Set B', '07/31/1980', 'Pond', 63.457, 'Monthly', 54, 6, 2)
    )v(DataSetName, "Date", Sname, Level, Frequency, SetId, ScenarioId, FrequencyId)
  )
select *,
  dense_rank() over(order by DataSetName, Sname) S_row_id
from t;

DataSetName Date        Sname   Level   Frequency   SetId   ScenarioId  FrequencyId S_row_id
    Set A   02/29/1980  Base    64,014  Monthly     49      1           2           1
    Set A   01/31/1980  Base    64,007  Monthly     49      1           2           1
    Set A   04/30/1980  Stress  64,008  Monthly     49      2           2           2
    Set A   03/31/1980  Stress  64,015  Monthly     49      2           2           2
    Set B   07/31/1980  Agile   63,788  Monthly     54      25          2           3
    Set B   07/31/1980  Agile   63,212  Monthly     54      25          2           3
    Set B   07/31/1980  Pond    63,457  Monthly     54      6           2           4
    Set B   08/31/1980  Pond    63,868  Monthly     54      27          2           4
    Set B   06/30/1980  Raptor  63,972  Monthly     54      24          2           5
    Set B   05/31/1980  Storm   63,993  Monthly     54      5           2           6
0 голосов
/ 05 июля 2018

что-то вроде

    SELECT T2.*, D2.TheID FROM Table1 T2 JOIN 
    (
        SELECT D1.Sname, row_number() OVER (ORDER BY D1.sname) TheID FROM 
        (SELECT DISTINCT t1.Sname From Table1 t1) D1
    ) D2
    ON T2.sname = D2.sname
...