[英]How to count distinct values based on condition in sqlite?
我的名为 matchEvent 的表如下所示:
eventId playerId matchId eventName description
--------------------------------------------------------
100 50 1 goal freeKick
100 50 1 goal shot
200 50 2 foul penalty
300 51 3 goal header
300 51 3 goal ownGoal
400 51 4 goal ownGoal
400 51 4 goal shot
我想计算特定球员在特定比赛中的所有常规进球(但不包括乌龙球)。 我试过了:
con = sqlite3.connect(my_db)
regular_goals = con.execute("SELECT playerId, matchId, COUNT(DISTINCT eventId) FROM matchEvent WHERE eventName = 'goal' GROUP BY playerId, matchId HAVING description <> 'ownGoal'").fetchall()
问题是 HAVING 子句似乎是根据组的顶行值过滤组,所以它给了我:
[(50, 1, 1),(51, 3, 1)]
而我期望的结果是:
[(50, 1, 1)]
因为我的表只包含一个常规目标。
您需要 2 个级别的聚合:
SELECT playerId, matchId, SUM(counter) total_goals
FROM (
SELECT playerId, matchId, COUNT(DISTINCT eventId) counter
FROM matchEvent
GROUP BY eventId, playerId, matchId
HAVING SUM(eventName = 'goal') > 0 AND SUM(description = 'ownGoal') = 0
) t
GROUP BY playerId, matchId
见演示。
或者:
SELECT playerId, matchId, COUNT(*) total_goals
FROM (
SELECT playerId, matchId
FROM matchEvent
GROUP BY eventId, playerId, matchId
HAVING SUM(eventName = 'goal') > 0 AND SUM(description = 'ownGoal') = 0
) t
GROUP BY playerId, matchId
见演示。
或者:
SELECT playerId, matchId, COUNT(DISTINCT eventId) total_goals
FROM matchEvent
WHERE eventName = 'goal'
AND eventId NOT IN (SELECT eventId FROM matchEvent WHERE description = 'ownGoal')
GROUP BY playerId, matchId
见演示。
结果:
| playerId | matchId | counter |
| -------- | ------- | ------- |
| 50 | 1 | 1 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.