我有一个简单的table
timestamp
s,t
ypes和c
等
timestamp |t|c
==============
1415024797|1|1
1415025774|1|1
1415202785|1|1
1415204559|1|1
1415204593|1|2
1415629057|1|1
1415791322|2|1
1415797887|1|1
现在我得到一个结果,该结果按c
列出t
列组并计算某个日期YYYY-MM-DD
我必须在时间戳中添加3600
以尊重时区偏移量!
SELECT From_unixtime(a.timestamp + 3600, '%Y-%m-%d') AS date,
Count(From_unixtime(a.timestamp + 3600, '%Y-%m-%d')) AS count,
a.t AS type
FROM table AS a
WHERE a.timestamp >= 1415322000 AND a.timestamp < 1415926800
GROUP BY From_unixtime(a.timestamp + 3600, '%Y-%m-%d'),
a.t
ORDER BY a.timestamp DESC
使用此查询我得到类似
的内容date |count | type
==========================
2014-12-03 | 3 | 1
2014-12-03 | 1 | 2
2014-12-04 | 3 | 1
2014-12-05 | 3 | 3
2014-12-07 | 4 | 2
2014-12-07 | 7 | 3
....
但我想得到
date | t_1 | t_2 | t_3
=============================
2014-12-03 | 3 | 1 | 0
2014-12-04 | 3 | 0 | 0
2014-12-05 | 0 | 0 | 3
2014-12-06 | 0 | 0 | 0
2014-12-07 | 0 | 4 | 7
....
因此,在每一行上都有一个日期,其中包含特定类型的所有计数。
t_1
,2 =&gt; t_2
,3 =&gt; t_3
)2014-12-06
)的日期 答案 0 :(得分:1)
有一种相对简单的方法可以做到这一点,但重复/丑陋的代码量随着t值的增加而增加:
你基本上做的是:select date,
count(case when type=1 then 1 else null end) as t1_count,
count(case when type=2 then 1 else null end) as t2_count...
et cetera
如果你期望有很多不同的t值,这就变得非常不切实际了,你必须要考虑更复杂的技术,例如:http://www.artfulsoftware.com/infotree/qrytip.php?id=523
编辑: 如果您想要包含根本没有数据的日期,那么您应该考虑创建一个日期表,然后“离开”加入&#39;它到你的结果集。您可以使用此代码(https://gist.github.com/johngrimes/408559) - 只需忽略创建数字表的前两个语句。
答案 1 :(得分:1)
SELECT From_unixtime(a.timestamp + 3600, '%Y-%m-%d') AS date,
CASE
WHEN type = 1
THEN count
ELSE
NULL
END AS t_1,
CASE
WHEN type = 2
THEN count ELSE NULL END AS t_2,
CASE
WHEN type = 3
THEN count ELSE NULL END AS t_3
FROM...
(?)