0
我有用戶,他們跑,我有每圈的時間戳記錄。Postgres:找到時間戳行之間的最小差異
我想按最快圈數排序用戶。
的想法是用「滯後」的Postgres的功能,具有「GROUP BY user_ID的」
我試過的東西,但我不知道「滯後」好,而且我不能和窗函數(圈)與聚合函數(分鐘)工作
http://sqlfiddle.com/#!15/ec9dc/6
你有一個想法?
感謝
我有用戶,他們跑,我有每圈的時間戳記錄。Postgres:找到時間戳行之間的最小差異
我想按最快圈數排序用戶。
的想法是用「滯後」的Postgres的功能,具有「GROUP BY user_ID的」
我試過的東西,但我不知道「滯後」好,而且我不能和窗函數(圈)與聚合函數(分鐘)工作
http://sqlfiddle.com/#!15/ec9dc/6
你有一個想法?
感謝
如果你想通過你必須列user_id
分割行的一圈持續時間訂購的用戶。否則,不同用戶的圈速時間會有所不同。
我已將您的示例代碼修改了一下:我刪除了一個時間戳,插入了兩次,然後引入了包含窗口函數rank()
和lag()
的視圖。前者用於計算每個用戶的圈數,後者用於確定當前時間戳的前一個時間戳。
BEGIN;
CREATE TABLE lap
(
user_id text,
timestamp timestamp without time zone
);
INSERT INTO lap VALUES
('a', '2015-08-20 16:14:30.568'),
('a', '2015-08-20 16:16:13.06'),
('b', '2015-08-20 16:16:18.06'),
('b', '2015-08-20 16:16:25.63'),
('b', '2015-08-20 16:17:10.568'),
('a', '2015-08-20 16:17:25.63'),
--('a', '2015-08-20 16:17:34.087'), -- Timestamp was inserted twice.
('a', '2015-08-20 16:17:34.087');
CREATE OR REPLACE VIEW user_lap_duration AS
SELECT
user_id,
-1+rank() OVER w AS lap_nr,
lag(timestamp) OVER w AS timestamp_prev,
timestamp,
timestamp - lag(timestamp)
OVER w
AS lap_duration
FROM
lap
WINDOW w AS (PARTITION BY user_id ORDER BY timestamp);
SELECT
user_id,
lap_nr,
lap_duration
FROM
user_lap_duration
WHERE
lap_nr <> 0
ORDER BY
lap_duration;
ROLLBACK;
運行上面的代碼會生成以下輸出。
user_id | lap_nr | lap_duration
---------+--------+--------------
b | 1 | 00:00:07.57
a | 3 | 00:00:08.457
b | 2 | 00:00:44.938
a | 2 | 00:01:12.57
a | 1 | 00:01:42.492
(5 rows)
我得到這個:http://sqlfiddle.com/#!15/ec9dc/6但時間戳混合在用戶之間 –