MySQL Subselect按行数

时间:2019-01-23 22:52:45

标签: mysql

我希望使用下表并以下面概述的格式表示数据。

所有Type A dates作为Date 1列,Type B dates作为Date 2列。 Type A的行数总是比Type B多,因此对于任何丢失的行,我都需要包含null。

我不确定这是什么类型的转换,可能会引起误解。

查询可以用mysql> = 5.7

编写
Type A -> Date 1
Type B -> Date 2

------------------     
|    Table       |
-----------------|
| type |  date   |
|   A  | 2019-01 |
|   A  | 2019-02 |
|   A  | 2019-03 |
|   A  | 2019-04 |
|   B  | 2018-10 |
|   B  | 2018-11 |
------------------

我想将数据转换为以下内容:

------------------------
|   Date 1   |   Date 2 |
|   2019-01  |  2018-10 |
|   2019-02  |  2018-11 |
|   2019-03  |  null    |
|   2019-04  |  null    |
-------------------------

2 个答案:

答案 0 :(得分:3)

尝试类似的方法,mysql没有行号或等级函数,这很痛苦,但是可以通过类似的方法实现

SET @row_number_a = 0;
SET @row_number_b = 0;

SELECT * FROM
(SELECT
(@row_number_a:=@row_number_a + 1) AS rn, date
FROM test 
WHERE type = 'A'
ORDER BY date DESC) a

LEFT JOIN 
(SELECT
(@row_number_b:=@row_number_b + 1) AS rn, date
FROM test 
WHERE type = 'B'
ORDER BY date DESC) b
ON a.rn = b.rn

答案 1 :(得分:2)

在MySQL 8+中,您可以使用ROW_NUMBER()对行进行排序,然后将B日期与相应的A日期结合起来。请注意,如果您的B日期比A日期多,则需要一个FULL JOIN,该日期在MySQL中不可用,但可以由{{ 1}}和UNION。如果不是这种情况,则可以从LEFT JOIN开始删除查询的一部分。

RIGHT JOIN

输出

UNION

Demo on dbfiddle(这也表明WITH a AS (SELECT ROW_NUMBER() OVER (ORDER BY `date`) AS `row`, `date` FROM table1 WHERE type = 'A'), b AS (SELECT ROW_NUMBER() OVER (ORDER BY `date`) AS `row`, `date` FROM table1 WHERE type = 'B') SELECT a.date AS `Date 1`, b.date AS `Date 2` FROM a LEFT JOIN b ON b.row = a.row UNION SELECT a.date AS `Date 1`, b.date AS `Date 2` FROM a RIGHT JOIN b ON b.row = a.row 需要比Date 1 Date 2 2019-01 2018-10 2019-02 2018-11 2019-03 2019-04 日期更多的FULL JOIN日期)。