यह परिणाम प्राप्त करने के लिए, आप पिवट . करना चाहेंगे आंकड़ा। MySQL में पिवट फ़ंक्शन नहीं है लेकिन आप CASE
. के साथ एक समग्र फ़ंक्शन का उपयोग कर सकते हैं अभिव्यक्ति।
यदि तिथियों की संख्या ज्ञात है, तो आप क्वेरी को हार्ड-कोड कर सकते हैं:
select client_id,
max(case when rownum = 1 then date end) Date1,
max(case when rownum = 2 then date end) Date2,
max(case when rownum = 3 then date end) Date3
from
(
select client_id,
date,
@row:=if(@prev=client_id, @row,0) + 1 as rownum,
@prev:=client_id
from yourtable, (SELECT @row:=0, @prev:=null) r
order by client_id, date
) s
group by client_id
order by client_id, date
देखें SQL Fiddle with Demo
मैंने client_id
. के भीतर प्रत्येक रिकॉर्ड के लिए एक पंक्ति संख्या निर्दिष्ट करने के लिए उपयोगकर्ता चर लागू किए हैं समूह।
यदि आपके पास अज्ञात तिथियों की संख्या है, तो आपको गतिशील रूप से एसक्यूएल बनाने के लिए तैयार कथन का उपयोग करने की आवश्यकता होगी:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN rownum = ',
rownum,
' THEN date END) AS Date_',
rownum
)
) INTO @sql
from
(
select client_id,
date,
@row:=if(@prev=client_id, @row,0) + 1 as rownum,
@prev:=client_id
from yourtable, (SELECT @row:=0) r
order by client_id, date
) s
order by client_id, date;
SET @sql
= CONCAT('SELECT client_id, ', @sql, '
from
(
select client_id,
date,
@row:=if(@prev=client_id, @row,0) + 1 as rownum,
@prev:=client_id
from yourtable, (SELECT @row:=0) r
order by client_id, date
) s
group by client_id
order by client_id, date');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
देखें SQL Fiddle with Demo ।
वे दोनों परिणाम देते हैं:
| CLIENT_ID | DATE_1 | DATE_2 | DATE_3 |
--------------------------------------------------------------------------------------------------------------
| 1 | February, 03 2013 00:00:00+0000 | February, 10 2013 00:00:00+0000 | May, 12 2013 00:00:00+0000 |
| 2 | February, 03 2013 00:00:00+0000 | July, 15 2013 00:00:00+0000 | (null) |