Как разделить с подведением итогов в SQL Server 2014 - PullRequest
0 голосов
/ 19 мая 2018

Я не эксперт по 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 Ответ

0 голосов
/ 19 мая 2018

Здесь я внес несколько изменений в запрос, который вы задали

QUERY 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 для группировки записей, затем создать какой-нибудь ранг и затем отфильтровать предпочтительный ранг следующим образом

QUERY 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
...