如何在MySQL中滞后列?

时间:2015-11-24 16:48:29

标签: mysql

我想在除最后一条记录之外的所有记录中显示NULL。在最后的记录中想要显示以前的记录值。 结果表将由start_date订购。

我有桌子:

╔════╦══════════╦════════════╦════════════╗
║ id ║ pay_rate ║ start_date ║  end_date  ║
╠════╬══════════╬════════════╬════════════╣
║  2 ║      50  ║ 2015-08-01 ║ 2015-08-15 ║
║  4 ║      50  ║ 2015-08-16 ║ 2999-12-31 ║
║  5 ║      55  ║ 2015-07-01 ║ 2999-12-31 ║
╚════╩══════════╩════════════╩════════════╝

我想要的结果如下:

╔═════╦══════════════╦════════════════╦══════════════════╦══════════════╗
║ id  ║  pay_rate    ║ Pre_pay_rate   ║  pre_start_date  ║ pre_end_date ║
╠═════╬══════════════╬════════════════╬══════════════════╬══════════════╣
║ 5   ║ 50           ║ NULL           ║ NULL             ║ NULL         ║
║ 2   ║ 50           ║ NULL           ║ NULL             ║ NULL         ║
║ 4   ║ 55           ║ 50             ║ 2015-08-01       ║ 2015-08-15   ║
╚═════╩══════════════╩════════════════╩══════════════════╩══════════════╝

提前致谢: - )

1 个答案:

答案 0 :(得分:0)

啰嗦&可能有更好的解决方案,但这会得到你想要的结果。

查询的第一部分选择除最后一条记录之外的所有记录,通过按相反顺序排序,跳过第一条记录&然后按日期顺序求助。第二部分选择最终记录&加入到之前的记录中。

SELECT id, pay_rate, pre_payrate, pre_start_date, pre_end_date FROM 
(SELECT * FROM (SELECT id, pay_rate, start_date, NULL pre_payrate, NULL pre_start_date, NULL pre_end_date
FROM mytable
ORDER BY start_date DESC
LIMIT 1, 9223372036854775807) alias1 ORDER BY start_date) alias2
UNION ALL
SELECT * FROM
(SELECT id, pay_rate
FROM mytable
ORDER BY start_date DESC 
LIMIT 1) alias3
JOIN
(SELECT pay_rate pre_payrate, start_date pre_start_date, end_date pre_end_date
FROM mytable
ORDER BY 1 DESC 
LIMIT 1,1) alias4

注意 - start_date需要包含在第一个查询中,以便可以将查询放回正确的日期顺序。 9223372036854775807是最大的签名int。