SQLServer count()over()with distinct

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)

example_data.sql

想要的结果集:

+--------------------------------------+-----------+----------+-------+
|                  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)

Vla*_*nov 1

你真的应该在问题中解释你需要什么,而不是在评论中。

我们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)