Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Group By and get distinct value that occurs most often

I want to group by a varchar column and find the foreignkey value that occurs the most. The problem is that multiple fiModel can be assigned to the same TAC(first 8 digits of a 15-digit value called SSN_Number).

Here is a simplified model and query with sample-data:

create table #data(
    SSN_Number varchar(15),
    fiModel int
)
insert into #data
        SELECT '351806038155151',451 UNION ALL SELECT '353797028764243',232 UNION ALL SELECT '353797028764243',438 UNION ALL SELECT '353797028764243',438 UNION ALL SELECT '353797028764243',447 UNION ALL SELECT '358372015611578',318 UNION ALL SELECT '352045039834626',279 UNION ALL SELECT '352045031234567',279 UNION ALL SELECT '351806035647381',451 UNION ALL SELECT '352045037654321',207

--- following query returns all records(10)
select * from #data Order By SSN_Number

--- following query gives the distinct TAC's+fiModel, but TACs can repeat (9)
select substring(ssn_number,1,8)as TAC,fiModel,count(*) from #data
group by substring(ssn_number,1,8),fiModel
Order By substring(ssn_number,1,8),fiModel

--- following query gives the correct(distinct) TAC's (4), 
--- but i need the fiModel that occurs most often with the assigned TAC
--- if the number is the same, it doesn't matter what to take
select substring(ssn_number,1,8)as TAC,count(*) from #data
group by substring(ssn_number,1,8)
Order By substring(ssn_number,1,8)

drop table #data

So this is the desired result:

TAC         fiModel
35180603    451
35204503    279
35379702    438
35837201    318
like image 398
Tim Schmelter Avatar asked Nov 05 '22 09:11

Tim Schmelter


1 Answers

This should do the trick (CTE's to the rescue!):

;with cte as (
    select substring(ssn_number,1,8) as TAC, fiModel, ROW_NUMBER() OVER (PARTITION BY substring(ssn_number,1,8) ORDER BY count(*) desc) as row
    from #data
    group by substring(ssn_number,1,8),fiModel
)
select TAC, fiModel
from cte
where row = 1

As subquery:

Select TAC,fiModel
from(
    Select substring(ssn_number,1,8)as TAC, fiModel
      ,ROW_NUMBER() OVER (PARTITION BY substring(ssn_number,1,8) ORDER BY count(*) desc) as row
    from #data
    group by substring(ssn_number,1,8),fiModel
)as data
where row=1
like image 166
John N Avatar answered Nov 09 '22 07:11

John N