【问题标题】:How to do SQL query for DISTINCT and COUNT at the same time如何同时对 DISTINCT 和 COUNT 进行 SQL 查询
【发布时间】:2020-01-29 07:53:16
【问题描述】:

我尝试做一个允许我DISTINCT column1 (name), column2 (mode) and column3 (date) 的查询。但同时,我想计算同一张表中mode 列中的值。我尝试加入这 2 个查询(下面),但查询来自同一个表。有什么解决办法吗?

  1. 从表名中选择不同的名称、模式、日期
  2. 从表名中选择计数(模式)

OnHand 列是 Mode 列中的 COUNT

【问题讨论】:

  • 请提供样本和预期结果。
  • 我已经包含了预期的结果
  • 。 .您的结果不是表格格式。在 table 中,所有行的列数都相同。

标签: mysql sql count distinct


【解决方案1】:

如果我理解正确,您需要窗口函数:

SELECT column1, column2, column3,
       SUM(COUNT(*)) OVER (PARTITION BY column2) as column2_cnt
FROM table_name 2
GROUP BY column1, column2, column3;

在每一行上,您将在整个表格中获得column2 值的计数。因此,这些值将在具有相同 column2 值的行上重复。

编辑:

根据您修改后的问题,您似乎想要:

SELECT name, mode, date,
       COUNT(*) OVER (PARTITION BY name) as cnt
FROM table_name
GROUP BY name, mode, date;

你可以用其他方式表达:

SELECT t.name, t.mode, t.date, tn.cnt
FROM table_name t JOIN
     (SELECT name, COUNT(DISTINCT mode, date) as cnt
      FROM table_name t
      GROUP BY name
     ) tn
     ON t.name = tn.name
GROUP BY t.name, t.mode, t.date, tn.cnt;

【讨论】:

  • 我已经编辑了问题并包含了预期的结果,你能看看吗?
  • 感谢您的反馈,我已尝试您编辑的查询。但是OVER后面的圆括号有错误,说"("在这个位置无效,期待:EOF,';'这是我用的代码`COUNT(mode) OVER( PARTITION BY name) AS cnt
  • @Lilly 。 . .窗口函数从 MySQL 8+ 开始可用,因此编辑后的查询取决于您的 MySQL 版本。
  • 是的,我知道这一点。我正在使用 MySQL Workbench 8.0,我认为我的版本可以使用窗口功能。这是我的查询SELECT name, mode, date COUNT(mode) OVER(PARTITION BY name) AS cnt FROM table_name GROUP BY name, mode, date;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
相关资源
最近更新 更多