Как избавиться от нескольких branch_id? - PullRequest
1 голос
/ 01 ноября 2019

У меня есть SQL-запрос этого:

SELECT 
    COUNT(PERMISSION_ID) AS USER_TOTAL_PERMISSION_PER_BRANCH,
    USER_ID,
    BRANCH_ID
FROM BRANCH_PERMISSION_USER
GROUP BY USER_ID, BRANCH_ID
ORDER BY USER_ID, USER_TOTAL_PERMISSION_PER_BRANCH DESC

Но у меня проблема, потому что я хочу только первую строку для user_id. Основная цель состоит в том, чтобы собрать список пользователей вместе с его веткой и топ-1 или отличительным от USER_TOTAL_PERMISSION_PER_BRANCH

Вот пример выходных данных:

click here

Ожидаетсявывод должен быть:

[USER_TOTAL_PERMISSION_PER_BRANCH][USER_ID][BRANCH_ID]

135    1    1
135    2    1
134    3    1
1      4    1
1      5    1
1      6    1

Ответы [ 3 ]

2 голосов
/ 01 ноября 2019

Вы можете использовать оконные функции:

SELECT USER_TOTAL_PERMISSION_PER_BRANCH, USER_ID, BRANCH_ID
FROM (SELECT COUNT(*) AS USER_TOTAL_PERMISSION_PER_BRANCH,
             USER_ID, BRANCH_ID,
             ROW_NUMBER() OVER (PARTITION BY USER_ID ORDER BY COUNT(*) DESC) as seqnum
      FROM BRANCH_PERMISSION_USER
      GROUP BY USER_ID, BRANCH_ID
     ) ub
WHERE seqnum = 1
1 голос
/ 01 ноября 2019

Вы можете преобразовать свой запрос в CTE и выполнить фильтрацию, используя корреляцию:

with cte as (
    select 
        count(permission_id) as user_total_permission_per_branch,
        user_id,
        branch_id
    from branch_permission_user
    group by user_id, branch_id
)
select c.* 
from cte c
where c.user_total_permission_per_branch = (
    select max(c1.user_total_permission_per_branch)
    from cte c1 
    where c1.user_id = c.user_id and c1.branch_id = c.branch_id
)
0 голосов
/ 01 ноября 2019

Благодаря сэру @ Гордону

Я использую его логику. Вот оно:

SELECT USER_TOTAL_PERMISSION_PER_BRANCH, USER_ID, BRANCH_ID
FROM (SELECT COUNT(*) AS USER_TOTAL_PERMISSION_PER_BRANCH,
             USER_ID, BRANCH_ID,
             ROW_NUMBER() OVER (PARTITION BY USER_ID ORDER BY COUNT(*) DESC) as seqnum
      FROM BRANCH_PERMISSION_USER
      GROUP BY USER_ID, BRANCH_ID
     ) ub
WHERE seqnum = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...