我有一个群组表,例如:
[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
答案 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