SQL:一列中相对于另一列的值计数
我有下表SQL:一列中相对于另一列的值计数,sql,Sql,我有下表 id date time_stamp licenseid storeid deviceid value 1 2015-06-12 17:36:15 lic0001 1 0add 52 2 2015-06-12 17:36:15 lic0002 1 0add 54 3 2015-06-12 17:36:15 lic0003
id date time_stamp licenseid storeid deviceid value
1 2015-06-12 17:36:15 lic0001 1 0add 52
2 2015-06-12 17:36:15 lic0002 1 0add 54
3 2015-06-12 17:36:15 lic0003 1 0add 53
4 2015-06-12 17:36:21 lic0001 1 0add 54
5 2015-06-12 17:36:21 lic0002 1 0add 59
6 2015-06-12 17:36:21 lic0003 1 0add 62
7 2015-06-12 17:36:21 lic0004 1 0add 55
8 2015-06-12 17:36:15 lic0001 1 0bdd 53
9 2015-06-12 17:36:15 lic0002 1 0bdd 52
10 2015-06-12 17:36:15 lic0003 1 0bdd 52
我需要deviceid的计数,该计数基于在中看到的时间戳的数量。因此,输出类似于:0add出现在2个时间戳中,因此计数为2,而0bdd出现在一个时间戳中,因此0bdd的计数为1。计数时不考虑每个时间戳对应于设备的许可证数
date deviceid count
2015-06-12 0add 2
2015-06-12 0bdd 1
我正在尝试下面的查询,但无法验证它是否有效,因为该查询已经执行了相当长的时间,并且没有显示任何结果:
select date, deviceid, count(deviceid) from my_table group by deviceid, time_stamp
请注意,我正在运行此查询的行数是2000000
time\u stamp
的列是time
类型
select date, deviceid, count(deviceid) from my_table group by date,deviceid
你有时间戳而不是日期。这个查询真的不应该返回任何东西,因为它是一个无效的组。< p>我想你需要考虑一下这里的一些事情:
- 如果需要每个日期的每个设备的时间戳数量,则应按设备和日期分组,而不是按设备和时间戳分组
COUNT(DISTINCT timestamp)
。请尝试以下查询:
SELECT device_id, date, COUNT(DISTINCT timestamp) AS numRows
FROM myTable
GROUP BY device_id, date;
下面是一个使用示例数据的示例。还值得注意的是,如果此查询对您来说仍然很慢,那么在设备id和日期列上放置索引可能有助于此查询更快地运行。有关这方面的更多讨论,请参阅评论。根据声明,您的分组成员应在
日期
,而不是时间戳
。。。“我需要deviceid的计数,它是基于在中看到的时间戳的数量。”我认为您需要count(Distinct TimeStamp)
,因为licenseID会导致计数高于期望值,并且deviceid不代表您所追求的唯一计数。然而,即使这样也会有问题,因为时间戳的粒度比显示的粒度要细得多,您必须将时间戳格式化为HH:MM:SS以截断nano secodsAlso,MySQL有DateTime对象,用于在一列中存储日期和时间,所以你不需要两个单独的索引。你可以建议一些索引来回答他的第二个问题,这将使这个答案完整。索引不必是唯一的对。主键可以,但索引可以是非唯一的。幸运的是,我的小提琴不需要更改!:D@xQbert表面上看是的。我还在测试它。将在验证后接受它。@McAdam331花了大约50秒执行,但给出了正确的结果。我将尝试为这些列编制索引,看看是否有所改进。