Tho*_*ann 9 sql-server join inner-join count window-functions
我正在研究一个项目,我们需要计算不同行的数量.方案的简化版本包括user表,keyword表和keyword_user表.
该user表仅包括公共用户元数据,如名称等.下面列出了其他表.
keyword_user:
id
user_id
keyword_id
Run Code Online (Sandbox Code Playgroud)
关键词:
id,
description
Run Code Online (Sandbox Code Playgroud)
我想要做的是根据用户keyword_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' )
Run Code Online (Sandbox Code Playgroud)
结果集:
+--------------------------------------+-----------+----------+-------+
| 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 |
+--------------------------------------+-----------+----------+-------+
Run Code Online (Sandbox Code Playgroud)
问题:
这里的问题是,迈克尔被计算两次,因此总计数是3,当我希望它是2.使用时count() over()你无法解析表达式,包含不同的.另外,如果我只是SELECT DISTINCT,我的结果集看起来很好,除了总计数,仍然是3.
如果我需要提供更多信息来支持这个问题,请告诉我,我会尽力回答.
MSSQL CREATE DB SCRIPT(SAMPLE DATA)
想要的结果集:
+--------------------------------------+-----------+----------+-------+
| id | firstname | lastname | total |
+--------------------------------------+-----------+----------+-------+
| F0527AC3-747A-45A6-9CF9-B1F6C7F548F8 | Kasper | Thomsen | 2 |
| 95988F6D-9C91-4779-B6C3-3D4B4D6AE836 | Michael | Jacobsen | 2 |
+--------------------------------------+-----------+----------+-------+
Run Code Online (Sandbox Code Playgroud)
你真的应该在问题中解释你需要什么,而不是在评论中。
我们CTE_Users找到给定关键字的所有不同用户。然后将结果与 结合起来user以获取用户详细信息。至少它会根据给定的小样本数据产生您期望的结果。
WITH
CTE_Users
AS
(
SELECT DISTINCT ku.user_id
FROM
keyword_user AS ku
WHERE
ku.keyword_id IN (
'5f6501ec-0a71-4067-a21d-3c5f87a76411',
'c19b95c0-8554-4bbd-9526-db8f1c4f1edf')
AND ku.user_id NOT IN (
'12db3001-b3b9-4626-8a02-2519102cb53a')
)
SELECT TOP(5)
u.id
,u.firstname
,u.lastname
,COUNT(*) OVER() AS total
FROM
user AS u
INNER JOIN CTE_Users ON CTE_Users.user_id = u.id
;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
483 次 |
| 最近记录: |