Azure/U-SQL — ORDER BY в ROW_NUMBER()

Я создаю сценарий U-SQL с несколькими промежуточными таблицами. Я хотел бы назначить ROW_NUMBER() на основе порядка одного из столбцов, но не могу понять, как это сделать.

@t = SELECT *
     FROM(
        VALUES
        ( 1, "2010-01-01","TagName1", 30 ),
        ( 2, "2010-01-01","TagName2", 5 ),
        ( 2, "2010-01-02","TagName2", 7 ),
        ( 2, "2010-01-02","TagName3", 6 ),
        ( 3, "2010-01-03","TagName2", 15 ),
        ( 1, "2010-01-01","TagName2", 2 ),
        ( 1, "2010-01-01","TagName3", 1),
        ( 3, "2010-01-04","TagName1", 2 ),
        ( 3, "2010-01-04","TagName2", 4 )
     ) AS T(DeviceID, Date, TagName, dv);

@t2 = SELECT DISTINCT(dv) as dv
             , ROW_NUMBER() OVER() as LevelNumber
      FROM @t
      ORDER BY dv;

Если я запускаю приведенный выше код, он говорит мне переместить ORDER BY в оператор OUTPUT, но тогда это не работает, когда содержимое таблицы изменяется в последующих манипуляциях.

Я попытался поместить имя столбца в часть OVER(), но это тоже не работает.

Я хотел бы что-то вроде этого:

  dv          LevelNumber
  1                1
  2                2      
  4                3
  5                4

Какие-либо предложения?


person screechOwl    schedule 11.11.2017    source источник


Ответы (1)


Вы можете включить предложения ORDER BY и/или PARTITION BY в предложение OVER. Вы можете переместить предложение ORDER BY в оператор OUTPUT, например

@t = SELECT *
     FROM(
        VALUES
        ( 1, "2010-01-01","TagName1", 30 ),
        ( 2, "2010-01-01","TagName2", 5 ),
        ( 2, "2010-01-02","TagName2", 7 ),
        ( 2, "2010-01-02","TagName3", 6 ),
        ( 3, "2010-01-03","TagName2", 15 ),
        ( 1, "2010-01-01","TagName2", 2 ),
        ( 1, "2010-01-01","TagName3", 1),
        ( 3, "2010-01-04","TagName1", 2 ),
        ( 3, "2010-01-04","TagName2", 4 )
     ) AS T(DeviceID, Date, TagName, dv);


//@t2 = SELECT DISTINCT(dv) as dv
//             , ROW_NUMBER() OVER() as LevelNumber
//      FROM @t
//      ORDER BY dv;


@output =
    SELECT DeviceID,
           Date,
           TagName,
           dv,
           ROW_NUMBER() OVER( ORDER BY dv ) AS LevelNumber
    FROM @t;


OUTPUT @output TO "/output/output.csv"
ORDER BY dv
USING Outputters.Csv();

Самое близкое, что я мог получить к вашему результату, было с этим запросом, но нужная вам логика не понятна мне на 100%:

@output =
    SELECT dv,
           ROW_NUMBER() OVER(ORDER BY dv) AS LevelNumber
    FROM
    (
        SELECT DISTINCT dv
        FROM @t
    ) AS x;
person wBob    schedule 11.11.2017