2017-11-11 139 views
1

我正在構建一個包含多箇中間表的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 

有什麼建議?

回答

2

您可以在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;