我有一個包含進程中某些統計值的表。該表具有以下格式:彙總查詢中的第一個值
CREATE TABLE data (
process integer NOT NULL,
time timestamp NOT NULL
first double precision,
last double precision,
first_time timestamp,
last_time timestamp
)
本表中的數據插入每一分鐘,並且包含了最後一分鐘的總 值。例如,對於一個流程1,我們可以有 以下數據:
+---------------------------------------------------------------------------------+
| process | time | first | last | first_time | last_time |
+---------------------------------------------------------------------------------+
| 1 | 2014-09-22 12:00:00 | 100 | 200 | 2014-09-22 12:00:00 | 2014-09-22 12:00:59 |
| 1 | 2014-09-22 12:01:00 | 104 | 152 | 2014-09-22 12:01:00 | 2014-09-22 12:01:59 |
| 1 | 2014-09-22 12:02:00 | 141 | 155 | 2014-09-22 12:02:10 | 2014-09-22 12:02:59 |
| 1 | 2014-09-22 12:03:00 | 122 | 147 | 2014-09-22 12:03:00 | 2014-09-22 12:02:45 |
+---------------------------------------------------------------------------------+
正如你可以在第三排看,有些時候,第一個值是不是微小的 第二個0。在最後一次這也發生(第四行)。
從this page使用的第一和最後的功能,和從所述this page功能date_round ,我想在30分鐘 間隔選擇一個給定的處理的第一個值。
當我嘗試以下兩個查詢時,兩個結果都是正確的。
SELECT
date_round(time, '30 min'::interval) AS "time",
first(first)
FROM
data
WHERE
process = 1
AND
time > '2014-09-20 00:00:00'
AND
time < '2014-09-22 18:00:00'
GROUP BY 1
ORDER BY 1
和
SELECT
date_round(time, '30 min'::interval) AS "time",
first(first) AS "value"
FROM (
SELECT
time,
first
FROM
data
WHERE
process = 1
AND
time > '2014-09-20 00:00:00'
AND
time < '2014-09-22 18:00:00'
ORDER BY 1
) A
GROUP BY 1
ORDER BY 1
我的問題是:爲什麼第一個查詢在這種情況下工作? postgres在 應用group by子句之前對數據進行排序?
我的疑問是因爲「第一個」函數返回兩個傳遞參數的第一個值。 如果數據未排序,則「第一個」聚合函數 中的第一個調用可能包含的值不正確,導致無效值,對不對?
我可以安全地使用第一個查詢還是應該使用第二個查詢?