兩個查詢,這兩個給你預期的結果,並使用30分鐘窗戶,但有你的要求完全不同的解釋之間enterDate用戶和計算時間......你可能想澄清的問題。
SQL Fiddle
的Oracle 11g R2架構設置:
CREATE TABLE table_name (PersistentId, UserId, EnterDate) AS
SELECT 111, 1, to_date('June 1, 2015 17:05','Month DD, YYYY HH24:MI') FROM DUAL
UNION ALL SELECT 112, 1, to_date('June 1, 2015 17:21','Month DD, YYYY HH24:MI') FROM DUAL
UNION ALL SELECT 113, 1, to_date('June 1, 2015 17:27','Month DD, YYYY HH24:MI') FROM DUAL
UNION ALL SELECT 114, 1, to_date('June 1, 2015 18:25','Month DD, YYYY HH24:MI') FROM DUAL
UNION ALL SELECT 115, 1, to_date('June 1, 2015 19:00','Month DD, YYYY HH24:MI') FROM DUAL
UNION ALL SELECT 116, 2, to_date('June 1, 2015 18:05','Month DD, YYYY HH24:MI') FROM DUAL
UNION ALL SELECT 117, 2, to_date('June 1, 2015 18:21','Month DD, YYYY HH24:MI') FROM DUAL
UNION ALL SELECT 118, 2, to_date('June 1, 2015 19:27','Month DD, YYYY HH24:MI') FROM DUAL
查詢1 - 計數在30分鐘窗口結果:
SELECT UserId,
"Count"
FROM (
SELECT UserID,
COUNT(*) OVER (PARTITION BY UserId ORDER BY EnterDate RANGE BETWEEN INTERVAL '30' MINUTE PRECEDING AND CURRENT ROW) AS "Count",
EnterDate,
LEAD(EnterDate) OVER (PARTITION BY UserId ORDER BY EnterDate) AS nextEnterDate
FROM Table_Name
)
WHERE "Count" > 1
AND EnterDate + INTERVAL '30' MINUTE < nextEnterDate
Results:
| USERID | Count |
|--------|-------|
| 1 | 3 |
| 2 | 2 |
查詢2 - 計數是另一行 30分鐘之內的所有行:
SELECT UserID,
COUNT(1) AS "Count"
FROM (
SELECT UserID,
EnterDate,
LAG(EnterDate) OVER (PARTITION BY UserId ORDER BY EnterDate) AS prevDate,
LEAD(EnterDate) OVER (PARTITION BY UserId ORDER BY EnterDate) AS nextDate
FROM Table_Name
)
WHERE EnterDate - INTERVAL '30' MINUTE < prevDate
OR EnterDate + INTERVAL '30' MINUTE > nextDate
GROUP BY UserId
Results:
| USERID | Count |
|--------|-------|
| 1 | 3 |
| 2 | 2 |
https://oracle-base.com/articles/misc/lag-lead-analytic-functions –
'17:05','17:30'和'17:55'會計爲2還是3?後續對之間的差異小於30分鐘,但第一次和最後一次之間的差異爲50分鐘。如果你有'19:00','19:25','20:00'和'20:25',會發生什麼?用戶ID是否有兩次,因爲有兩個時間間隔小於30分鐘,或者是4次? – MT0