【发布时间】:2016-01-14 21:41:28
【问题描述】:
我正在做一个项目,我们需要计算不同行的数量。该场景的简化版本包括user 表、keyword 表和keyword_user 表。
user 表只包含常见的用户元数据,如姓名等。其他表如下所列。
keyword_user:
id
user_id
keyword_id
关键词:
id,
description
我想要做的是根据用户关键字 ID 找到最大用户数 (5),同时还要计算匹配行的总数。计数必须是不同的。
查询:
SELECT TOP 5 u.[id],
u.[firstname],
u.[lastname],
total = Count(*) OVER()
FROM [user] u
INNER JOIN [keyword_user] ku
ON u.[id] = ku.[user_id]
WHERE ( ku.keyword_id IN ( '5f6501ec-0a71-4067-a21d-3c5f87a76411', 'c19b95c0-8554-4bbd-9526-db8f1c4f1edf'))
AND u.id NOT IN ( '12db3001-b3b9-4626-8a02-2519102cb53a' )
结果集:
+--------------------------------------+-----------+----------+-------+
| id | firstname | lastname | total |
+--------------------------------------+-----------+----------+-------+
| F0527AC3-747A-45A6-9CF9-B1F6C7F548F8 | Kasper | Thomsen | 3 |
| 95988F6D-9C91-4779-B6C3-3D4B4D6AE836 | Michael | Jacobsen | 3 |
| 95988F6D-9C91-4779-B6C3-3D4B4D6AE836 | Michael | Jacobsen | 3 |
+--------------------------------------+-----------+----------+-------+
问题:
这里的问题是,Michael 被计算了两次,因此总计数为 3,而我希望它为 2。使用 count() over() 时,您无法将包含不同的表达式解析到其中。另外,如果我只是SELECT DISTINCT,我的结果集看起来很好,除了总数,它仍然是 3。
如果我需要提供更多信息来支持这个问题,请告诉我,我会尽力回答。
MSSQL 创建数据库脚本(样本数据)
想要的结果集:
+--------------------------------------+-----------+----------+-------+
| id | firstname | lastname | total |
+--------------------------------------+-----------+----------+-------+
| F0527AC3-747A-45A6-9CF9-B1F6C7F548F8 | Kasper | Thomsen | 2 |
| 95988F6D-9C91-4779-B6C3-3D4B4D6AE836 | Michael | Jacobsen | 2 |
+--------------------------------------+-----------+----------+-------+
【问题讨论】:
-
亲爱的,我删除了我的答案,我认为一个解决方案
-
试试我的更新答案
-
是的,给我一秒钟,我会试试看 :)
-
另外请注意我添加了一个带有示例数据的脚本
-
@ThomasTeilmann,请使用架构、示例数据和预期结果创建 SqlFiddle,而不是发布指向 Dropbox 的链接。目前,您在问题中发布的预期结果集与示例数据不匹配。
标签: sql-server join count inner-join window-functions