我有一个包含以下格式的日志表(和示例数据):
date | time
2010/01/02 | 10:00
2010/01/02 | 13:00
2010/01/04 | 02:34
我想创建一个SQL查询,它将使用以下格式检索结果:
date1 | time1 | date2 | time2
2010/01/02 | 10:00 | 2010/01/02 | 13:00
2010/01/02 | 13:00 | 2010/01/04 | 02:34
2010/01/04 | 02:34 | <null> | <null>
所以我认为左外连接可以解决问题:
SELECT
i.date as date1,
i.time as time1,
j.date as date2,
j.time as time2
FROM
log_table i
LEFT OUTER JOIN
log_table j
ON
i.id = j.id
AND (j.date > i.date
OR (j.date == i.date AND j.time > i.time))
但是,这会产生以下结果:
date1 | time1 | date2 | time2
2010/01/02 | 10:00 | 2010/01/02 | 13:00
2010/01/02 | 10:00 | 2010/01/04 | 02:34
2010/01/02 | 13:00 | 2010/01/04 | 02:34
2010/01/04 | 02:34 | <null> | <null>
顺便说一下,使用的数据库是PostgreSql。
感谢。
答案 0 :(得分:3)
在PostgreSQL 8.4
:
SELECT date AS date1, time AS time1,
LEAD(date) OVER (ORDER BY date, time, id) AS date2,
LEAD(time) OVER (ORDER BY date, time, id) AS time2
FROM log_table
ORDER BY
date, time, id
,或者只是这个:
SELECT date1, time1, (lnext).*
FROM (
SELECT date AS date1, time AS time1,
LEAD(lt) OVER (ORDER BY date, time, id) AS lnext
FROM log_table lt
) q
ORDER BY
date, time, id
在PostgreSQL 8.3
及以下:
SELECT date AS date1, time AS time1,
(li).date AS date2, (li).time AS time2
FROM (
SELECT lo.*,
(
SELECT li
FROM log_table li
WHERE (li.date, li.time, li.id) > (lo.date, lo.time, lo.id)
ORDER BY
date, time, id
LIMIT 1
) AS li
FROM log_table lo
) q
答案 1 :(得分:0)
SELECT
i.date as date1,
i.time as time1,
min(j.date) as date2,
min(j.time) as time2
FROM
log_table i
LEFT OUTER JOIN
log_table j
ON
i.id = j.id
AND (j.date > i.date
OR (j.date == i.date AND j.time > i.time))
GROUP BY i.date, i.time