SQL:从行中选择值到自定义列

时间:2018-03-09 12:23:36

标签: mysql sql pivot

我有一个群组表,例如:

[id]        [name]
1           Group1
2           Group2
3           Group3

和他们的另一张桌子:

[id]    [group_id]  [date]
1       1           2018-03-03
2       1           2018-03-09
3       1           2018-03-06
4       2           2018-03-08

如何使用PIVOT或任何其他方式向每个群组显示3个最后日期:

[group_id]  [group_name]    [date_1]    [date_2]    [date_3]
1           Group1          2018-03-09  2018-03-06  2018-03-03
2           Group2          2018-03-08  NULL        NULL
3           Group3          NULL        NULL        NULL

2 个答案:

答案 0 :(得分:0)

如果您可以将一列中的日期连接在一起,则快捷方式为:

select g.id, g.name,
       substring_index(group_concat(date order by date desc), ',', 3)
from groups g left join
     schedule s
     on g.id = s.group_id
group by g.id, g.name;

注意:group_concat()的中间值有一个最大长度。它是1024字节,对于大多数用途来说都很好,但可以很容易地变大。

答案 1 :(得分:0)

这应该这样做:

SELECT t.id AS group_id,
       t.name AS group_name,
       MAX(CASE t.row_num WHEN 1 THEN t.date ELSE NULL END) AS date_1,
       MAX(CASE t.row_num WHEN 2 THEN t.date ELSE NULL END) AS date_2,
       MAX(CASE t.row_num WHEN 3 THEN t.date ELSE NULL END) AS date_3
  FROM (SELECT t1.id,
               t1.name,
               t2.date,
               ROW_NUMBER() OVER(PARTITION BY t1.id ORDER BY t2.date DESC) row_num
          FROM TAB_1 t1
          LEFT OUTER JOIN TAB_2 t2
            ON t1.id = t2.group_id) t
 GROUP BY t.id, t.name

它使用ROW_NUMBER()对每个组的日期进行排名,然后为每个列选择正确的日期。

第一步:对每个组的日期进行排名

[group_id]  [group_name]   [date]      [row_num]
1           Group 1        2018-03-09  1
1           Group 1        2018-03-06  2
1           Group 1        2018-03-03  3
2           Group 2        2018-03-08  1
3           Group 3        NULL        1

第二步:将日期指向右栏

[group_id]  [group_name]   [date_1]       [date_2]       [date_3]
1           Group 1        2018-03-09     NULL           NULL
1           Group 1        NULL           2018-03-06     NULL
1           Group 1        NULL           NULL           2018-03-03
2           Group 2        2018-03-08     NULL           NULL
3           Group 3        NULL           NULL           NULL

第三步:获取每列的MAX()

[group_id]  [group_name]   [date_1]       [date_2]       [date_3]
1           Group 1        2018-03-09     2018-03-06     2018-03-03
2           Group 2        2018-03-08     NULL           NULL
3           Group 3        NULL           NULL           NULL

看起来MySQL并没有这种分析功能。我没有太多关于MySQL的经验,但也许你可以让它工作。请检查一下:ROW_NUMBER() in MySQL

相关问题