我在一个表格中有以下数据:
Time, Type, Kilometers
12:00, 1, 0.1
12:30, 2, 0.2
14:00, 1, 0.4
15:00, 2, 1.0
16:00, 1, 1.2
16:30, 2, 1.5
16:45, 1, 2.0
此数据使用DateTime字段按时间顺序排序。我想将这些记录“对”显示为1行,如下所示:
StartTime, Type1Km, Type2Km
12:00, 0.1, 0.2
14:00, 0.4, 1.0
16:00, 1.2, 1.5
16:45, 2.0, NULL
有几点需要注意:如果没有Type1启动,则在结果表的Type1Km字段中显示NULL。同样,如果没有Type2结束,则在记录的Type2Km字段中显示NULL。
我怎么能这样做?
答案 0 :(得分:4)
不幸的是,MySQL缺少FULL OUTER JOIN
,因此您必须将UNION
两个集合在一起。
这将为您提供Type1Km
存在的情况,无论Type2Km
是否存在。
SELECT
t1.`Time` as StartTime,
t1.`Kilometers` as Type1Km,
t2.`Kilometers` as Type2Km
FROM `times` t1
LEFT JOIN `times` t2 ON t2.`Type` = 2
AND t2.`Time` = (SELECT `Time` FROM `times`
WHERE `Time` > t1.`Time`
ORDER BY `Time` LIMIT 1)
WHERE t1.`Type` = 1
现在我们需要Type1Km
不存在的情况。
SELECT
t2.`Time` as StartTime,
NULL as Type1Km,
t2.`Kilometers` as Type2Km
FROM `times` t2
LEFT JOIN `times` t1 ON t1.`Time` = (SELECT `Time` FROM `times`
WHERE `Time` < t2.`Time`
ORDER BY `Time` DESC LIMIT 1)
WHERE t2.`Type` = 2
AND (t1.`Type` = 2 OR t1.`Type` IS NULL)
UNION
这些人在一起,你得到了理想的结果:
(
SELECT
t1.`Time` as StartTime,
t1.`Kilometers` as Type1Km,
t2.`Kilometers` as Type2Km
FROM `times` t1
LEFT JOIN `times` t2 ON t2.`Type` = 2
AND t2.`Time` = (SELECT `Time` FROM `times`
WHERE `Time` > t1.`Time`
ORDER BY `Time` LIMIT 1)
WHERE t1.`Type` = 1
) UNION ALL (
SELECT
t2.`Time` as StartTime,
NULL as Type1Km,
t2.`Kilometers` as Type2Km
FROM `times` t2
LEFT JOIN `times` t1 ON t1.`Time` = (SELECT `Time` FROM `times`
WHERE `Time` < t2.`Time`
ORDER BY `Time` DESC LIMIT 1)
WHERE t2.`Type` = 2
AND (t1.`Type` = 2 OR t1.`Type` IS NULL)
)
ORDER BY `StartTime`
更新
在我之前的查询中,我忘记了在一开始就记录了“2型”记录。更新以解释该问题。这是我得到的结果:
times
表中的数据:
+----------+------+------------+
| Time | Type | Kilometers |
+----------+------+------------+
| 11:00:00 | 2 | 0.1 |
| 12:00:00 | 1 | 0.1 |
| 12:30:00 | 2 | 0.2 |
| 14:00:00 | 1 | 0.4 |
| 14:30:00 | 1 | 0.8 |
| 15:00:00 | 2 | 1.0 |
| 15:30:00 | 2 | 0.2 |
| 16:00:00 | 1 | 1.2 |
| 16:30:00 | 2 | 1.5 |
| 16:45:00 | 1 | 2.0 |
+----------+------+------------+
查询结果:
+-----------+---------+---------+
| StartTime | Type1Km | Type2Km |
+-----------+---------+---------+
| 11:00:00 | NULL | 0.1 |
| 12:00:00 | 0.1 | 0.2 |
| 14:00:00 | 0.4 | NULL |
| 14:30:00 | 0.8 | 1.0 |
| 15:30:00 | NULL | 0.2 |
| 16:00:00 | 1.2 | 1.5 |
| 16:45:00 | 2.0 | NULL |
+-----------+---------+---------+
答案 1 :(得分:0)
如果可以,将表结构更改为type1km和type2km,然后在添加kms时更新或在选择时总结。
答案 2 :(得分:0)
这可能有效
select
max(Time),
substring_index(group_concat(if(type=2,null,Kilometers) order by type),',',1),
substring_index(group_concat(if(type=1,null,Kilometers) order by type desc),',',1)
from your_table
group by date_format(Time, '%H');
我按小时假设小组,也不值得你的例子结果不准确
更好地解释搞笑查询的内容
group_concat(if(type=2,null,Kilometers) order by type
-- this is ensure the Kilometers must NOT from type=2
group_concat(if(type=1,null,Kilometers) order by type desc
-- this is ensure the Kilometers must NOT from type=1