計算與窗口集合函數sum()
運行總和後,只需根據created_at
超過1000接的第一行:
SELECT *
FROM (
SELECT order_id, created_at
, sum(price) OVER (ORDER BY created_at) AS sum_price
FROM orders
) sub
WHERE sum_price >= 1000
ORDER BY created_at
LIMIT 1;
這應該比@Gordon's version更快,因爲採摘根據第一相同的已經在窗口函數中使用的順序比計算每行的值要便宜很多,這不是sargable。
我使用sum_price >= 1000
,所以達到1000也完全符合要求。如果只有超過應符合使用>
而不是>=
。
The manual on window functions informs:
除了這些功能,任何內建或用戶定義的聚合 函數可以被用作一個窗函數
應當注意,這個查詢總是隻提供一行,而不是@戈登的查詢。如果有多行created_at
跨越1000個障礙,所有這些行將符合Gordon的答案(否則將失敗,請參閱下文),而在我的領域中只有one
。這將是一個任意的,只要你不添加更多的項目ORDER BY
作爲tiebreaker。像:
ORDER BY created_at, order_id
有ORDER的兩個實例通過這個查詢,它只是碰巧,你可以修改的一個或兩個,使其工作。爲了使排序順序一致,這應該是最快的。
其實,戈登的版本將完全失敗本次測試的情況:
CREATE TEMP TABLE orders(order_id int, price int, created_at date);
INSERT INTO orders VALUES
(1, 500, '2013-07-01')
,(2, 400, '2013-07-02')
,(3, 100, '2013-07-03')
,(4, 100, '2013-07-03')
,(5, 100, '2013-07-03');
您可以通過窗口函數使排序順序解決它獨特的像上面這樣證實。
或者你可以改變幀定義爲窗口功能:
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
Read the fine print in the manual.
但它是慢兩種方式。
-> SQLfiddle
什麼區別訂單?或者,會有多個結果,還是隻有一個? –
主鍵是一個名爲uuid的列,它是一個唯一的字符串。 –