Нахождение наиболее повторяющегося элемента из таблицы, сгруппированной по ограничениям в SQL - PullRequest
1 голос
/ 20 марта 2019

В моем коде у меня есть таблица:

CREATE TABLE SERVICE
(
    SER_ID      INT primary key NOT NULL,
    SER_TYPE    VARCHAR(35)     NOT NULL,
    SER_STARTDATE DATE          NOT NULL,
    SER_ENDDATE   DATE,
    LAW_SOCNUM    VARCHAR(8),
    FOL_ID  INT,
    CLI_ID      INT,
    FOREIGN KEY (LAW_SOCNUM) REFERENCES LAWYER ON DELETE SET NULL,
    FOREIGN KEY (FOL_ID) REFERENCES FEILD_OF_LAW ON DELETE SET NULL,
    FOREIGN KEY (CLI_ID) REFERENCES CLIENT ON DELETE SET NULL,

);

и таблица:

CREATE TABLE FEILD_OF_LAW
(
    FOL_ID INT PRIMARY KEY NOT NULL,
    FOL_NAME VARCHAR(35) NOT NULL
);

Моя задача - найти название службы, которая была наиболее распространенной в данный год, который является просто областью названия закона. У меня проблемы с получением правильного значения, так как вызов max для FEILD_OF_LAW.FOL_NAME приведет к получению только одного нижнего значения в алфавитном порядке. Вот что я попробовал:

select distinct year(SER_STARTDATE) as 'YEAR', max(fol) as 'MOST_COMMON_SERV'
from SERVICE join (select SERVICE.SER_ID, FEILD_OF_LAW.FOL_NAME as 'fol'
    from SERVICE join FEILD_OF_LAW on SERVICE.FOL_ID = FEILD_OF_LAW.FOL_ID) a1 on SERVICE.SER_ID = a1.SER_ID 
group by year(SER_STARTDATE)

Может кто-нибудь помочь мне объяснить, как получить наиболее повторяющийся идентификатор FOL_ID, указанный в таблице SERVICE, и как сгруппировать его по году. Благодаря.

Ответы [ 3 ]

0 голосов
/ 20 марта 2019

Это первая в каждой группе проблема. Может быть, попробуйте это:

with cte (the_year, the_count, the_fol_id, the_fol_name, row_num) AS (
    select datepart(year,ser_startDate), count(*), s.fol_id, fol_name,
        row_number() OVER(PARTITION BY datepart(year,ser_startDate) 
            ORDER BY count(*) DESC) AS rowNum
    from service s
        join feild_of_law f on f.fol_ID=s.fol_id
    group by datepart(year,ser_startDate), s.fol_id, fol_name
)
select *
    from cte 
where cte.row_num=1

Группы cte по количеству вхождений в каждом году и применяют номера строк для каждой группы, а вторая часть выбирает первую строку для каждой группы.

0 голосов
/ 20 марта 2019

Я прочитал другой ответ, но у них есть проблема: результат верен только тогда, когда вы приближаетесь к одному году.Если вам нужна статистика за более чем один год, вы можете сделать это:

create view VW_ServiceStats as ( 

Select year(ser_startdate) as year, 
             fol.fol_name, 
            COUNT(*) as [Service Count]
from service ser 
inner join feild_of_law fol 
on ser.fol_id = fol.fol_id
group by  YEAR(ser.ser_startdate),fol.fol_name


)


Select YEAR , max(fol_name), MAX([service count])
from vw_servicestats
group by year

Я создал представление, которое содержит первую группировку (year-fol-count).Затем я выбрал только больше предоставляемых услуг в год.

Я думаю, что этот путь также более аккуратный, чем другие.

0 голосов
/ 20 марта 2019

Я думаю, что вам нужно использовать агрегатную функцию count, а не группу max wit с помощью fol_id с top 1, она будет возвращать наиболее повторяющиеся Fol_id с year.Если вы хотите проверить все значения, то удалите предложение top 1 из запроса.

        select top 1 year(SER_STARTDATE) as 'YEAR', count(fol) as 
       'MOST_COMMON_SERV',fol
        from SERVICE join (select SERVICE.SER_ID, FEILD_OF_LAW.FOL_NAME as 'fol'
         from SERVICE join FEILD_OF_LAW on SERVICE.FOL_ID = FEILD_OF_LAW.FOL_ID) a1 
        on SERVICE.SER_ID = a1.SER_ID 
        group by year(SER_STARTDATE),fol
        order by count(fol) desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...