如何使用group by并选择distinct

时间:2017-12-12 08:38:33

标签: sql firebird

我正在使用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查询,产生" unique"的总数。每天登录(同一天中同一工人的几次登录应算作一次事件)。

以下查询:

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

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

3 个答案:

答案 0 :(得分:4)

您希望每天统计不同的用户:

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

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