在没有分析函数的情况下查询 ANSI SQL 中的 NEXT 记录
一些更高级的 RDBMS 系统具有花哨的内置功能,例如分析和东西。我不知道您使用的是什么系统,但是您可以使用一些简单的 ANSI 标准 SQL 来完成任务。这就是我的想法......
在这种情况下,我们查询同一个表两次并将其连接到自身,但移动索引/连接键,以便第一个记录与它后面的记录对齐。我们使用 OUTER 连接,因为在示例数据中,并非所有类别都有多个时间条目。
[SQL Fiddle][1]
MySQL 5.5.32 架构设置:
CREATE TABLE punch_clock_timecard
(`ID` varchar(1), `In_time` datetime, `Out_Time` datetime,
`Total_Mins` int, `seq_num` int);
INSERT INTO punch_clock_timecard
(`ID`, `In_time`, `Out_Time`, `Total_Mins`, `seq_num`)
VALUES
('A', '2014-04-01 00:00:00', '2014-04-05 00:00:00', 5760, 1),
('B', '2014-04-01 22:30:00', '2014-04-02 22:30:00', 1440, 1),
('C', '2014-04-02 23:00:00', '2014-04-03 06:30:00', 450, 1),
('C', '2014-04-03 06:30:00', '2014-04-04 00:00:00', 1050, 2),
('C', '2014-04-04 00:00:00', '2014-04-06 08:00:00', 3360, 3),
('D', '2014-04-02 16:00:00', '2014-04-03 19:00:00', 180, 1),
('D', '2014-04-04 20:00:00', '2014-04-05 07:00:00', 660, 2);
查询 1:
select pct1.id, pct1.out_time, pct2.in_time as next_in_time,
pct1.seq_num, pct2.seq_num as next_seq_num
from punch_clock_timecard pct1
left outer join punch_clock_timecard pct2
on pct1.id = pct2.id
and (pct1.seq_num + 1) = pct2.seq_num
order by pct1.id asc, pct1.seq_num asc, pct2.seq_num asc;
Results:
| ID | OUT_TIME | NEXT_IN_TIME | SEQ_NUM | NEXT_SEQ_NUM |
|----|------------------------------|------------------------------|---------|--------------|
| A | April, 05 2014 00:00:00+0000 | (null) | 1 | (null) |
| B | April, 02 2014 22:30:00+0000 | (null) | 1 | (null) |
| C | April, 03 2014 06:30:00+0000 | April, 03 2014 06:30:00+0000 | 1 | 2 |
| C | April, 04 2014 00:00:00+0000 | April, 04 2014 00:00:00+0000 | 2 | 3 |
| C | April, 06 2014 08:00:00+0000 | (null) | 3 | (null) |
| D | April, 03 2014 19:00:00+0000 | April, 04 2014 20:00:00+0000 | 1 | 2 |
| D | April, 05 2014 07:00:00+0000 | (null) | 2 | (null) |
您可以将此查询包装在另一个 SQL 语句中,该语句选择并运行最终评估(即,OUT_TIME 与 NEXT_IN_TIME...)
前进!