Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:一列中相对于另一列的值计数_Sql - Fatal编程技术网

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>我想你需要考虑一下这里的一些事情:

    • 如果需要每个日期的每个设备的时间戳数量,则应按设备和日期分组,而不是按设备和时间戳分组
    • 您有一个行ID,设备ID具有相同的日期和时间戳,因此您可能需要考虑在每个日期中寻找不同的时间戳。
    对第一个的修复是不言自明的,对于第二个,您可以将聚合更改为
    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秒执行,但给出了正确的结果。我将尝试为这些列编制索引,看看是否有所改进。