如何在 SQL Server 2014 中使用子摘要进行分区

How to partition with a sub summary in SQL Server 2014

我不是 SQL 方面的专家,我真的很难解决这个问题(在 SQL Server Management Studio 中构建):

我的数据:

id_module     id_cr
---------------------
001           12345
001           67891
001           12345
001           25896
002           23456
003           78912
003           23456
004           34567
004           34567
004           34567
004           89123
004           34567
004           34567
004           89123
004           89123
004           66663

我希望它看起来像什么 - 显示每个模块的前 2 条内容(按条目数计算):

Grouped by id_module    Grouped by id_cr         Count (sum) of id_cr
001                     12345                    2
001                     67891                    1

002                     23456                    1

003                     78912                    1
003                     23456                    1

004                     34567                    5
004                     89123                    3

到目前为止我有:

SELECT 
    id_module, id_cr,
    RANK() OVER (PARTITION BY id_module ORDER BY id_module) AS 'Ranking',
    COUNT(*) OVER (PARTITION BY id_cr) AS webtrackerCount
FROM 
    webtracker_user 
WHERE
    id_module > 0 AND id_cr > 0 
ORDER BY 
    id_module, webtrackerCount DESC

这为我提供了所有模块,其中每个 id_cr 都列在各自的行中而不是分组。

示例:

id_module     id_cr        ranking    webtrackerCount
-----------------------------------------------------
001           64639        1          32
001           64639        1          32
(this is repeated 30 more times)
001           38099        1          12
(this is repeated 11 more times)
002           84562        1          50
(this is repeated 49 more times)
etc.

那么,我还有多远?有没有办法按照我的需要做报告?非常感谢任何帮助 :) 谢谢!

这里我根据您给出的查询做了一些修改

查询 1

SELECT ID_MODULE, ID_CR
FROM (SELECT DISTINCT id_module,id_cr,
    Rank() OVER (Partition by id_module Order by id_module, id_cr ) AS 'Ranking',
    FROM webtracker_user ) a
WHERE a.Ranking <= 2
Order by ID_MODULE

我希望这对你有用,让我们知道进展如何


或者你也可以让CTE对记录进行分组,然后做一些排名,然后过滤出喜欢的排名如下

查询 2

WITH CTE AS(
    SELECT *, Rank() OVER (Partition by id_module Order by  id_module, id_cr ) AS 'Ranking'
    FROM (SELECT DISTINCT id_module,id_cr
        FROM webtracker_user) a
)
SELECT ID_MODULE, ID_CR
FROM CTE a
WHERE a.Ranking <= 2
Order by ID_MODULE