如何从 table 中找到最频繁的代码(varchar)

How to find most frequent code(varchar) from a table

我想在与 table.

相同 code_group 的 CodeID 中找到最常见的代码

例如,从原来的table

ID     CodeID      Name      Code     Code_group
1         1         A        101          0
2         1         A        102          0
3         1         B        102          0
4         2         C        201          0
5         2         C        201          0
6         2         D        202          0
7         2         E        202          0
8         3         F        101          1
9         3         G        103          1
10        3         G        104          1
11        3         G        104          1

我想要像下面这样的输出。

ID     CodeID      Name      Code     Code_group    Selected_code
1         1         A        101          0             102
2         1         A        102          0             102
3         1         B        102          0             102
4         2         C        201          0             NULL
5         2         C        201          0             NULL
6         2         D        202          0             NULL
7         2         E        202          0             NULL
8         3         F        101          1             104
9         3         G        103          1             104
10        3         H        104          1             104 
11        3         H        104          1             104

即使第8个ID的代码在CodeID:1中相同,但不在同一个Code_group.

所以对于 CodeID:1,Selected_code 将是 102。 它必须在完全相同的 Code_group.

内计算

=======================================

我试过如下。 我不应该为这个使用 ID。 来自表 A

with m as
(
    select 
        CodeID,
        Name,
        Code,
        Code_group,
        cnt,
        Selected_code = ROW_NUMBER() over (partition by Code_group order by cnt desc)

        from( select CodeID, Name, Code,Code_group
        ,count(*) over (partition by Code,CodeID) as cnt from tableA
        group by CodeID, Name, Code, Code_group,
    ) as t  
    group by  CodeID,
        Name,
        Code,
        Code_group, cnt
)
select a.CodeID,
        a.Name,
        a.Code,
        a.Code_group, b.Code as Selected_code, cnt 
from(select
     CodeID,
        Name,
        Code,
        Code_group,Selected_code,
        cnt
    from m) as a left outer join
    (select CodeID,
        Name,
        Code,
        Code_group,Selected_code,
        cnt
 from m where selected_Code=1) as b on a.CodeID = b.CodeID and a.Code_Group = b.Code_Group 
    order by a.CodeID, a.Code_Group

这个问题是 有了陈述 使我的 table 与众不同。如果有完全相同的数据,如 ID 1,2,则只显示一行。 另外,如果频率完全相同,我不能使 NULL


我应该添加什么以获得我想要的输出? 或者有更好的方法吗?

CTE cte 通过 Code_groupCodeID 使用 dense_rank()

找到最高频率代码

CTE selected 检查任何具有相同频率的 Code 并排除它们。

最终查询只是 select 从原来的 table 和 LEFT JOINselected

with 
cte as
(
    select Code_group, CodeID, Code
    from
    (
        select Code_group, CodeID, Code, 
               r = dense_rank() over (partition by Code_Group, CodeID
                                          order by count(*) desc)
        from   tableA
        group by Code_group, CodeID,  Code
    ) c
    where c.r = 1
),
selected as
(
    select Code_group, CodeID, Code
    from
    (
        select Code_group, CodeID, Code, 
               cnt = count(*) over (partition by Code_group, CodeID)
        from   cte
    ) s
    where s.cnt = 1
)
select a.*, 
       Selected_Code = s.Code
from   tableA a
       left join selected s on  a.Code_Group = s.Code_Group
                            and a.CodeID     = s.CodeID;

db<>fiddle demo