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;