Sql select仅统计日期范围之间的重复事件
正如您从预期结果中看到的,我必须统计发送后不到24小时重新打开的电子邮件。 现在要计算发送后不到24小时内打开的电子邮件,我有:Sql select仅统计日期范围之间的重复事件,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,正如您从预期结果中看到的,我必须统计发送后不到24小时重新打开的电子邮件。 现在要计算发送后不到24小时内打开的电子邮件,我有: Source Tables: ( MAILING ) | ID | name | dt | ----------------------------------- | 1 | foo | 15-DEC-15 01.20.25.000000000 AM | 2 | bar | 16-DEC
Source Tables:
( MAILING )
| ID | name | dt |
-----------------------------------
| 1 | foo | 15-DEC-15 01.20.25.000000000 AM
| 2 | bar | 16-DEC-15 01.20.25.000000000 AM
( OPEN )
| ID | mailing | dt |
---------------------------------
| 1 | 1 | 15-DEC-15 03.20.25.000000000 AM
| 2 | 1 | 15-DEC-15 05.20.25.000000000 AM
| 3 | 2 | 16-DEC-15 03.20.25.000000000 AM
Expected result:
| name | TOTAL |
----------------------
| foo | 1 |
| bar | 0 |
谢谢你的帮助和时间 查询:
SELECT M.ID, COUNT(*) TOTAL
FROM MAILING.MAILING M
LEFT JOIN MAILING.OPEN O
ON O.mailing = M.ID
-- mailing between year
WHERE M.dt >= to_timestamp('01-Jan-2015', 'dd-MON-yyyy')
AND M.dt <= to_timestamp('31-Dec-2015', 'dd-MON-yyyy')
-- opened less than 24h after send
AND O.dt <= m.DATA_MAILING + INTERVAL '24' HOUR
GROUP BY M.ID, M.name, M.dt
ORDER BY M.dt ASC
SELECT name,
COUNT( opened_multiple ) AS total
FROM (
SELECT m.name,
LAG( 1 ) OVER ( PARTITION BY mailing ORDER BY o.id ) AS opened_multiple
FROM mailing m
LEFT OUTER JOIN
open o
ON ( m.id = o.mailing
AND o.dt BETWEEN m.dt AND m.dt + INTERVAL '24' HOUR )
WHERE m.dt >= TIMESTAMP '2015-01-01 00:00:00'
AND m.dt < TIMESTAMP '2016-01-01 00:00:00'
)
GROUP BY name;
NAME TOTAL
---- -----
foo 1
baa 0