SQL:一列中与另一列相关的值的计数

时间:2015-07-01 15:36:53

标签: 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       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

请注意,我运行此查询的行数为2,000,000

  1. 以上查询是否适合我的输出
  2. 如果是这样,我如何优化它以快速运行我的表格大小
  3. 编辑:标有time_stamp的列是TIME类型。

2 个答案:

答案 0 :(得分:5)

我认为你需要考虑以下几点:

  • 如果您想要每个日期的每个设备的时间戳数,则应按设备和日期进行分组,而不是设备和时间戳。
  • 您的设备ID具有相同日期和时间戳的行,因此您可能需要考虑在每个日期查找不同的时间戳。

对第一个的修复是自解释的,对于第二个,您可以将聚合更改为COUNT(DISTINCT timestamp)。试试这个问题:

SELECT device_id, date, COUNT(DISTINCT timestamp) AS numRows
FROM myTable
GROUP BY device_id, date;

以下是使用示例数据的SQL Fiddle示例。还值得注意的是,如果此查询对您来说仍然很慢,那么在device_id和date列上放置索引可以帮助此查询更快地运行。有关此问题的更多讨论,请参阅评论。

答案 1 :(得分:0)

select date, deviceid, count(deviceid) from my_table group by date,deviceid

你有时间戳而不是日期。查询确实应该没有返回任何内容,因为它是一个无效的组。