Postgresql 窗口函数,无需按顺序
在Postgresql 窗口函数,无需按顺序,postgresql,Postgresql,在OVER()子句中有一个不带orderby的窗口函数。是否保证将按照SELECT自身中的order by表达式指定的顺序处理行 例如: SELECT tt.* , row_number() OVER (PARTITION BY tt."group") AS npp --without ORDER BY FROM ( SELECT SUBSTRING(random() :: text, 3, 1) AS "group" , random() :: text
OVER()
子句中有一个不带orderby
的窗口函数。是否保证将按照SELECT自身中的order by
表达式指定的顺序处理行
例如:
SELECT tt.*
, row_number() OVER (PARTITION BY tt."group") AS npp --without ORDER BY
FROM
(
SELECT SUBSTRING(random() :: text, 3, 1) AS "group"
, random() :: text AS "data"
FROM generate_series(1, 100) t(ser)
ORDER BY "group", "data"
) tt
ORDER BY tt."group", npp;
在本例中,子查询返回各组中按升序排序的数据。window函数以相同的顺序处理行,因此行号按数据的升序排列。我能相信这个吗?好问题
不,你不能相信
窗口函数在查询的
ORDER BY子句之前处理,如果窗口定义中没有ORDER BY,则行将按照它们恰好来自子选择的顺序进行处理。如果在over()中使用
ORDER BY
row_number()(按tt分区。“组”按tt排序。“组”)
你应该得到你想要的订单。简短的回答是“否”。