Sql server 从sql中按限制分组的表中查找重复次数最多的元素

Sql server 从sql中按限制分组的表中查找重复次数最多的元素,sql-server,Sql Server,在我的代码中,我有以下表格: 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

在我的代码中,我有以下表格:

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
);
下表:

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
);
我的任务是找到在应用程序中最常见的服务的名称 给定年份,这只是法律名称的字段。我很难得到正确的值,因为在FEILD_OF_LAW上调用max。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,以及如何分组到其年份。谢谢。

我认为您必须使用count aggregate函数,而不是max wit group by fol\u id和top 1,它将返回最重复的fol\u id和年份。如果您不想检查所有值,请从查询中删除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

我认为您必须使用count aggregate函数,而不是max wit group by fol_id和top 1,它将返回年内重复次数最多的fol_id。如果您不想检查所有值,则从查询中删除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

这是每组第一题。也许可以试试这个:

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根据每年发生的次数进行分组,并为每个组应用行号,第二部分为每个组选择第一行。

这是每个组中的第一个问题。也许可以试试这个:

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根据每年发生的次数进行分组,并为每个组应用行号,第二部分为每个组选择第一行。

我阅读了另一个答案,但他们有一个问题:只有在接近一年时,结果才是正确的。 如果您需要一年以上的统计数据,您可以这样做:

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)的视图。 然后,我只选择每年提供更多的服务


我认为这种方法也比其他方法更整洁。

我读了另一个答案,但他们有一个问题:只有当你接近一年时,结果才是正确的。 如果您需要一年以上的统计数据,您可以这样做:

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)的视图。 然后,我只选择每年提供更多的服务


我认为这种方式也比其他方式更整洁。

与其向我们展示表格结构,不如使用样本输入和输出数据来表达您的问题。例如,(2016,civil),(2016,civil),(2016,family),(2017,Housing),(2017,crime),(2017,crime)的值会比(2016,civil),(2017,crime)的值大与其向我们展示表格结构,不如使用样本输入和输出数据来表达您的问题。例如,(2016,civil),(2016,civil),(2016,family),(2017,Housing),(2017,crime),(2017,crime)的值将显示(2016,civil),(2017,crime)