如何使用 group by 和 select distinct

Posted

技术标签:

【中文标题】如何使用 group by 和 select distinct【英文标题】:How to use group by and select distinct 【发布时间】:2017-12-12 08:38:33 【问题描述】:

我使用的是 Firebird 数据库,但使用大多数其他数据库引擎的 SQL 语法的答案也是可以接受的。

我有两张桌子:

WORKER
workerid: integer
worker names and so ot.

LOGEVENT
logeventid: integer
logday: integer
workerid: integer

因此 LOGEVENT 表用于跟踪工作人员登录。 为简单起见,我在这里使用 logday 作为表示登录日的整数。例如,它可以是从 1 到 365 的一年中的某一天。

因此典型的日志表可能如下所示:

logeventid   logday     workerid
1            5          3
2            5          4
3            5          3
4            5          7
5            6          4
6            6          3
7            6          4

正如所见,id = 3 的工作人员在第 5 天进行了两次登录。

现在我需要创建一个 SQL 查询,生成每天“唯一”登录的总数(同一工作人员在同一天的多次登录应计为一个事件)。

以下查询:

select  count(logeventid) as logincount, logday from logevent
group by logday
order by logday

第 5 天将显示 logincount = 4。因为它计算了 id = 3 的工人两次。虽然我必须只计算不同的工作人员登录。所以,我需要一个在第 5 天只产生 3 次登录的查询。

【问题讨论】:

猜你应该重新提出这个问题。 “独特的登录事件”正是“A. van Esveld”告诉你的——任何人,无论是同一个人还是其他人,穿过门的次数。每次开门 - 这是一个独特的事件。您需要的似乎是告诉每天有多少不同的工作人员登录,而不是唯一的登录事件,这是 LiveJournal 的“社会资本” 我同意这个问题没有得到清楚的解释。但我举了一个例子。是的,我需要计算每天的工作人员登录总数,但每个工作人员必须只计算一次(一天内)。 (这就是您在第二个变体中很好解释的内容:“每天有多少不同的工作人员登录”)。 然后编辑你的 Q 并改写它,以便将来其他人可以谷歌并找到它:-D 【参考方案1】:

您想统计每天不同的用户数:

select logday, count(distinct workerid) as logincount
from logevent
group by logday
order by logday;

【讨论】:

Thorsten,非常感谢您的回答。它确实奏效了!我想过在某处使用不同的wokerid。但是不知道可以直接放到count()里面。 @RomanVasin 我建议您阅读 Firebird 语言参考,例如,count【参考方案2】:

您想计算每天不同的 workerid。所以你需要这个查询:

select  count(DISTINCT workerid) as logincount, logday from logevent
group by logday
order by logday

【讨论】:

谢谢。它确实奏效了。 Thorsten 也提出了同样的问题。【参考方案3】:
select  count(logeventid) as logincount, logday from logevent
group by logday, workerid
order by logday

workerid 上的额外分组应该消除双重登录。

【讨论】:

我也想过在group by中添加workerid。最初(在提问之前)我在 logday 之前添加了它,例如:group by workerid, logday.但后来我尝试了你的变体:按 logday 分组,workerid。但两种变体都不起作用:它们产生相同的结果。

以上是关于如何使用 group by 和 select distinct的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个 select 语句中使用 count 和 group by

如何在 DataTable.Select(Expression) 中使用 SELECT GROUP BY?

如何在 MySQL 中对 GROUP BY 结果的 SELECT INTO 使用自动增量?

如何在 Laravel 中禁用 only_full_group_by 选项

如何加快这个 SELECT CONCAT/GROUP BY 查询?

MySQL GROUP BY 和 SELECT GROUP BY [重复]