对一个表的复杂SQL查询

时间:2015-12-06 11:37:09

标签: mysql sql crosstab

有一张桌子:

event |id |timestamp
---------------------
event1|001|21-03-15
event2|001|22-03-15
event1|002|23-03-15
event2|002|24-03-15

显示结果的请求应该是什么:

id |event1  |event2  |
----------------------
001|21-03-15|22-03-15|
002|23-03-15|24-03-15|

认为您首先需要选择独特的id

SELECT id FROM test GROUP BY id;

然后是这样的事情:

SELECT timestamp
FROM   ... 
WHERE id IN (SELECT id FROM test GROUP BY id) AND event='event1';

预先知道事件('event1', 'event2')。 如果在一个ID下有重复事件,具有不同或相同的时间戳,请在结果中添加列,例如:

id |event1  |event2  |event1  |event2  |
----------------------------------------
001|21-03-15|22-03-15|23-03-15|23-03-15|
002|23-03-15|24-03-15|NULL    |NULL    |

3 个答案:

答案 0 :(得分:1)

您正在寻找一个简单的“枢轴”或“交叉”技巧:

SELECT id
     , min(CASE event WHEN 'event1' THEN timestamp END) AS event1
     , min(CASE event WHEN 'event2' THEN timestamp END) AS event2
FROM   test
GROUP  BY id
ORDER  BY id;

SQL Fiddle.

答案 1 :(得分:1)

我找到了一个解决方案,查询看起来像这样:

C = 

    'BACDF'
    'BAF'
    'BACDEFG'
    'ABCDEF'
    'ABDEFG'
    'ABCDEFG'
    'ABCEG'

答案 2 :(得分:0)

您可以将event1的记录加入包含event2

的记录
SELECT t1.id as id, t1.timestamp as event1, t2.timestamp as event2 
FROM test t1 LEFT JOIN test t2
    ON t1.id = t2.id AND t1.event = 'event1' and t2.event = 'event2'

该查询假定您始终拥有event1,因此使用了LEFT JOIN。

如果您需要处理只有event2可用的情况,您可以按照Full Outer Join in MySQL

中的说明模拟FULL OUTER JOIN