我有一个2000万行的表。

每行代表一天+客户。

并非所有的日子都用行表示。

我需要获取一个日期范围,比如说2015年1月1日至2016年1月1日的表,该表将为每个客户从上到2015年1月1日最接近,从下到2016年最接近的行-01-01

表:

mysql - SQL-如何拼接同一张表中的两行-LMLPHP

所需结果:

mysql - SQL-如何拼接同一张表中的两行-LMLPHP

总结起来,这是将同一张表中的2行缝合成一行。

仅仅选择和加入就需要永远。查询此数据的正确方法是什么?

最佳答案

有几种方法。也许最简单的方法是使用substring_index() / group_concat() hack:

select client, min(date) as date1, max(date) as date2,
       substring_index(group_concat(random order by date), ',', 1) as random1,
       substring_index(group_concat(random order by date desc), ',', 1) as random2
from t
where date >= '2015-01-01' and
      date < '2016-01-01'
group by client;


给定您的样本数据,这应该可以正常运行。

一种更传统的方法是使用聚合和联接:

select c.client, c.date1, c.date2, t1.random as random1, t2.random as random2
from (select t.client, min(date) as date1, max(date) as date2
      from t
      where date >= '2015-01-01' and date < '2016-01-01'
      group by client
     ) c join
     t t1
     on c.client = t1.client and c.date1 = t1.date join
     t t2
     on c.client = t2.client and c.date2 = t2.date;


这也使添加两个以上的数据列变得更加容易。

关于mysql - SQL-如何拼接同一张表中的两行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36966253/

10-09 05:56