【问题标题】:count of distinct of column for each value in another column另一列中每个值的不同列计数
【发布时间】:2018-06-04 23:30:18
【问题描述】:

我在MySQL 中有一张如下表。我要选择serial_numdevicetypedevice_modeldistinct of timestamp for each serial_num

+-------------+-----------------+---------------+------------------------+
| serial_num  |   devicetype    | device_model  |        timestamp       |
+-------------+-----------------+---------------+------------------------+
| 58172A0396  |                 |               | 2003-01-02 17:37:15.0  |
| 58172A0396  |                 |               | 2003-01-02 17:37:15.0  |
| 46C5Y00693  | Mac Pro         | Mac PC        | 2018-01-03 17:17:23.0  |
| 1737K7008F  | Windows PC      | Windows PC    | 2018-01-05 11:12:31.0  |
| 1737K7008F  | Network Device  | Unknown       | 2018-01-05 11:12:31.0  |
| 1737K7008F  | Network Device  | Unknown       | 2018-01-05 11:12:31.0  |
| 1737K7008F  | Network Device  |               | 2018-01-06 03:12:52.0  |
| 1737K7008F  | Windows PC      | Windows PC    | 2018-01-06 03:12:52.0  |
| 1737K7008F  | Network Device  | Unknown       | 2018-01-06 03:12:52.0  |
| 1665NF01F3  | Network Device  | Unknown       | 2018-01-07 03:42:34.0  |
+----------------+-----------------+---------------+---------------------+

我已经尝试如下

select
    serial_num,
    devicetype,
    device_model,
    count(distinct timestamp)
from table
group by serialnum, devicetype, device_model

我想要的结果是

+-------------+-----------------+---------------+-----+
| serial_num  |   devicetype    | device_model  |count|
+-------------+-----------------+---------------+-----+
| 58172A0396  |                 |               |  1  |
| 58172A0396  |                 |               |  1  |
| 46C5Y00693  | Mac Pro         | Mac PC        |  1  |
| 1737K7008F  | Windows PC      | Windows PC    |  2  |
| 1737K7008F  | Network Device  | Unknown       |  2  |
| 1737K7008F  | Network Device  | Unknown       |  2  |
| 1737K7008F  | Network Device  |               |  2  |
| 1737K7008F  | Windows PC      | Windows PC    |  2  |
| 1737K7008F  | Network Device  | Unknown       |  2  |
| 1665NF01F3  | Network Device  | Unknown       |  1  |
+-------------+-----------------+---------------+-----+

我怎样才能做到这一点?

【问题讨论】:

  • 恐怕我对你想要什么有点困惑。您能否添加另一个表格来显示您的期望结果?
  • @ObsidianAge 我已经编辑了问题请看一下

标签: mysql group-by count


【解决方案1】:

仅在序列号上将表连接到自身以获取计数:

select
    t1.serial_num,
    t1.devicetype,
    t1.device_model,
    count(distinct t2.timestamp)
from table t1
join table t2 on t1.serial_num = t2.serial_num
group by 1, 2, 3

这允许表的每一行都在结果行中,同时查找所有时间戳,这需要点击其他行。

【讨论】:

  • 非常好。我只建议不要按列号分组,而是按列名。列名将是表中的(未知但可能存在的)主键,类似于 GROUP BY t1.id。
  • @roemer 在 group by 子句中使用列号是一种样式选择。我更喜欢数字的简洁性,因为如果非聚合表达式(可能很长/很复杂)必须重复,这违反了 DRY 原则,如果使用 MySQL(如这里),则会产生维护开销和可能的错误源,因为(取决于on settings) 允许从 group by 中省略列,如果仅更改列表达式,这可能会默默地破坏结果。使用数字可以避免所有这些问题,代码更短且没有缺点。
  • 我完全理解,但是,如果您以后决定更改查询中的任何内容,特别是,它很容易出现错误。列顺序。无论如何:最好是按主键分组,如果存在,我想我们可以同意。 ;)
  • @Roemer 好吧,有时主键不是您想要分组的对象(如这里),但经常是这种情况。至于列顺序的改变,我总是把非聚合字段first放在选择列表中,所以改变列顺序不是问题。顺便说一句,我使用数字 20 年了,从来没有遇到过任何类型的错误或问题。顺便说一句,很明显整个 group by 子句是多余的,在 SQL 语言中应该正式成为可选的。
猜你喜欢
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多