簡體   English   中英

SQL-如何拼接同一張表中的兩行

[英]SQL - How to stitch two rows from the same table

我有一個2000萬行的表。

每行代表一天+客戶。

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

我需要獲取一個日期范圍,比如說2015年1月1日至2016年1月1日的表格,該表格將為每個客戶從上到2015年1月1日最接近,從下到2016年最接近的那一行-01-01

表:

在此處輸入圖片說明

所需結果:

在此處輸入圖片說明

總結起來,這是將同一張表中的2行拼接成一行。

僅僅選擇和加入就需要永遠。 查詢該數據的正確方法是什么?

一種方法是使用兩個從屬子查詢-但這可能不是很有效,MySql在優化從屬子查詢方面不是很聰明。

SELECT client,
       date as date1,
       (  SELECT date FROM table t2
          WHERE t1.client = t2.client
            AND t2.date > t1.date
          ORDER BY t2.date LIMIT 1
        ) as date2,
       random As random1,
       (  SELECT random FROM table t2
          WHERE t1.client = t2.client
            AND t2.date > t1.date
          ORDER BY t2.date LIMIT 1
       ) as random2     
FROM table t1

您可以在table(client, date)上創建多列索引table(client, date)以加快此查詢的速度。

有幾種方法。 也許最簡單的方法是使用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;

這也使添加兩個以上的數據列變得更加容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM