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)