繁体   English   中英

MySQL:自连接表偏移了一行(相当于ROW_NUMBER()的T-SQL CTE)

[英]MySQL: Self join table offset by one row (equiv to T-SQL CTE with ROW_NUMBER())

就像标题所暗示的那样,在MySQL中 ,我想将一个表与其自身连接,偏移1行,以便可以为DateTime字段计算行之间的时间。

在T-SQL中,这将使用ROW_NUMBER()和CTE完成。

可以在mysql中使用变量模拟row_number。 例如,给定MariaDB [sandbox]>从日期限制10中选择*;

+------+------------+----------+------------------+-------------------+--------+
| id   | dte        | CalMonth | CalMonthDescLong | CalMonthDescShort | calQtr |
+------+------------+----------+------------------+-------------------+--------+
|    1 | 2000-01-01 |        1 | January          | Jan               |      1 |
|    2 | 2000-01-02 |        1 | January          | Jan               |      1 |
|    3 | 2000-01-03 |        1 | January          | Jan               |      1 |
|    4 | 2000-01-04 |        1 | January          | Jan               |      1 |
|    5 | 2000-01-05 |        1 | January          | Jan               |      1 |
|    6 | 2000-01-06 |        1 | January          | Jan               |      1 |
|    7 | 2000-01-07 |        1 | January          | Jan               |      1 |
|    8 | 2000-01-08 |        1 | January          | Jan               |      1 |
|    9 | 2000-01-09 |        1 | January          | Jan               |      1 |
|   10 | 2000-01-10 |        1 | January          | Jan               |      1 |
+------+------------+----------+------------------+-------------------+--------+
10 rows in set (0.00 sec)

这个查询

select s.*
        ,t.dte,t.rownumber1
from 
(
select d.*,@rn:=@rn+1 rownumber from 
(select @rn:=0) rn,dates d
) s
join
(
select d.*,@rn1:=@rn1+1 rownumber1 from 
(select @rn1:=0) rn,dates d
) t on t.rownumber1 = s.rownumber + 1
limit 10

退货

+-----------+------------+------------+
| id   | dte        | CalMonth | CalMonthDescLong | CalMonthDescShort | calQtr | rownumber | dte        | rownumber1 |
+------+------------+----------+------------------+-------------------+--------+-----------+------------+------------+
|    1 | 2000-01-01 |        1 | January          | Jan               |      1 |         1 | 2000-01-02 |          2 |
|    2 | 2000-01-02 |        1 | January          | Jan               |      1 |         2 | 2000-01-03 |          3 |
|    3 | 2000-01-03 |        1 | January          | Jan               |      1 |         3 | 2000-01-04 |          4 |
|    4 | 2000-01-04 |        1 | January          | Jan               |      1 |         4 | 2000-01-05 |          5 |
|    5 | 2000-01-05 |        1 | January          | Jan               |      1 |         5 | 2000-01-06 |          6 |
|    6 | 2000-01-06 |        1 | January          | Jan               |      1 |         6 | 2000-01-07 |          7 |
|    7 | 2000-01-07 |        1 | January          | Jan               |      1 |         7 | 2000-01-08 |          8 |
|    8 | 2000-01-08 |        1 | January          | Jan               |      1 |         8 | 2000-01-09 |          9 |
|    9 | 2000-01-09 |        1 | January          | Jan               |      1 |         9 | 2000-01-10 |         10 |
|   10 | 2000-01-10 |        1 | January          | Jan               |      1 |        10 | 2000-01-11 |         11 |
+------+------------+----------+------------------+-------------------+--------+-----------+------------+------------+
10 rows in set (0.09 sec)

SO上还有许多其他示例可能会更适合您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM