Azure/U-SQL - ORDER BY in ROW_NUMBER()

问题描述:

我正在构建一个包含多个中间表的U-SQL脚本。我想根据其中一列的顺序分配ROW_NUMBER(),但无法弄清楚如何实现。Azure/U-SQL - ORDER BY in 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 

有什么建议?

您可以在OVER子句中包含ORDER BY和/或PARTITION BY条款。您可以将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;