这是问题,
我有一张非常大的桌子:
Epoch_time MAC
-------------------------------------
1395275303 | 84:xx:xx:xx:xx:xx
1395275423 | bc:xx:xx:xx:xx:xx
1395275423 | 84:xx:xx:xx:xx:xx
我想计算每小时独特的MAC地址。所以我做了这个
SELECT Count(DISTINCT mac_adress), FROM_UNIXTIME(`date_ecoute`, '%d.%m.%Y.%H') as ndate FROM box1
WHERE date_ecoute > unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 2640 MINUTE)
AND signal_strength >= -60 group by ndate
效果很好,这是每小时的结果:
Count(DISTINCT mac_adress) ndate
--------------------------------------
2 | 20.03.2014.03
8 | 20.03.2014.06
11 | 20.03.2014.07
问题是我的表中有几个小时没有行,所以你可以看到上面的结果没有20.03.2014.04甚至05的行。我想要这个输出:
Count(DISTINCT mac_adress) ndate
--------------------------------------
2 | 20.03.2014.03
0 | 20.03.2014.04
0 | 20.03.2014.05
8 | 20.03.2014.06
11 | 20.03.2014.07
我尝试了IS NULL
,IF NULL
,LEFT JOIN
,COALESCE
。我不喜欢Sql ......
IFNULL(Count(DISTINCT mac_adress),0) // At the beginning, Doesn't work
答案 0 :(得分:0)
如果您假设数据中的所有小时都有一些数据,那么您可以使用条件聚合来获取0
。也就是说,在where
子句中将条件从case
子句移动到select
语句:
SELECT Count(DISTINCT case when signal_strength >= -60 then mac_adress end),
FROM_UNIXTIME(`date_ecoute`, '%d.%m.%Y.%H') as ndate
FROM box1
WHERE date_ecoute > unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 2640 MINUTE)
group by ndate
order by ndate;
如果您没有所有时间戳的数据,那么您将需要使用"驱动程序"表(或类似的)包含输出中所需的所有小时数。
编辑:
如果您每天都有数据,可以这样做:
SELECT d.ndate, h.hour,
Count(DISTINCT case when then mac_adress end)
from (select distinct FROM_UNIXTIME(`date_ecoute`, '%d.%m.%Y') as ndate
from box1
where date_ecoute > unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 2640 MINUTE)
) d cross join
(select 0 as hour union all select 1 union all select 2 union all select 3 union all
. . .
) h left outer join
box1
where date_ecoute > unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 2640 MINUTE) and
signal_strength >= -60
group by ndate, hour
order by min(dte_ecoute), hour;
让我补充一下。 。 。如果你有选择的话," YYYY-MM-DD" format最适合用于字符串表示。特别是,您可以直接使用它进行订购。