如何在连接查询中应用 max 函数?
How to apply max function in a join query?
我是 SQL 服务器的新手,我有 3 table 考虑员工 table
empid
name
location
1
abc
USA
2
efg
UK
另一个table命名位置-table
location
holidaycode
uk
uk1
usa
usa1
还有holidaytable
:
holiday-code
date
type
uk1
2022-01-01
LM
uk1
2022-01-01
RMC
预期结果是:
empid
location
holidaycode
date
type 1
2
uk
uk1
2022-01-01
RMC
假设我根据 empid 和日期查询 tables,说 empid 2 从特定日期开始可用的假期,以便在特定日期 (2022-01-01) 我有 LM 和那天RMC,我只需要RMC,如果RMC不可用,其他LMC。
请试试这个
select e.empid, e.location, h.holidaycode, [date], max([type])
from employee e inner join location_table l
on e.location=l.location
inner join holidaytable h
on l.holidaycode=h.holidaycode
where e.empid=2 and h.[date]='2022-01-01'
group by e.empid, e.location, h.holidaycode, [date]
示例:
架构和插入语句:
create table employee(empid int, name varchar(50), location varchar(50));
insert into employee values(1, 'abc', 'USA');
insert into employee values(2, 'efg', 'UK');
create table location_table(location varchar(50),holidaycode varchar(50));
insert into location_table values('uk','uk1');
insert into location_table values('usa','usa1');
create table holidaytable(holidaycode varchar(50), [date] date, [type] varchar(50));
insert into holidaytable values('uk1', '2022-01-01', 'LM');
insert into holidaytable values('uk1', '2022-01-01', 'RMC');
查询:
select e.empid, e.location, h.holidaycode, [date], max([type]) [type 1]
from employee e inner join location_table l
on e.location=l.location
inner join holidaytable h
on l.holidaycode=h.holidaycode
where e.empid=2 and h.[date]='2022-01-01'
group by e.empid, e.location, h.holidaycode, [date]
输出:
empid
location
holidaycode
date
type 1
2
UK
uk1
2022-01-01
RMC
db<>fiddle here
您可以使用 ROW_NUMBER
只获取每个分组的第一行。
要么 ORDER BY type DESC
要么使用 ORDER BY CASE WHEN type = 'RMC' THEN 1 ELSE 2 END
SELECT
e.empid,
e.location,
l.holidaycode,
h.date,
h.type
FROM employee e
JOIN location l ON l.location = e.location
JOIN (
SELECT *,
rn = ROW_NUMBER() OVER (PARTITION BY h.holidaycode, h.date ORDER BY h.type DESC)
FROM holiday h
) h ON h.holidaycode = l.holidaycode AND h.rn = 1
WHERE h.date = '2022-01-01';
我是 SQL 服务器的新手,我有 3 table 考虑员工 table
empid | name | location |
---|---|---|
1 | abc | USA |
2 | efg | UK |
另一个table命名位置-table
location | holidaycode |
---|---|
uk | uk1 |
usa | usa1 |
还有holidaytable
:
holiday-code | date | type |
---|---|---|
uk1 | 2022-01-01 | LM |
uk1 | 2022-01-01 | RMC |
预期结果是:
empid | location | holidaycode | date | type 1 |
---|---|---|---|---|
2 | uk | uk1 | 2022-01-01 | RMC |
假设我根据 empid 和日期查询 tables,说 empid 2 从特定日期开始可用的假期,以便在特定日期 (2022-01-01) 我有 LM 和那天RMC,我只需要RMC,如果RMC不可用,其他LMC。
请试试这个
select e.empid, e.location, h.holidaycode, [date], max([type])
from employee e inner join location_table l
on e.location=l.location
inner join holidaytable h
on l.holidaycode=h.holidaycode
where e.empid=2 and h.[date]='2022-01-01'
group by e.empid, e.location, h.holidaycode, [date]
示例:
架构和插入语句:
create table employee(empid int, name varchar(50), location varchar(50));
insert into employee values(1, 'abc', 'USA');
insert into employee values(2, 'efg', 'UK');
create table location_table(location varchar(50),holidaycode varchar(50));
insert into location_table values('uk','uk1');
insert into location_table values('usa','usa1');
create table holidaytable(holidaycode varchar(50), [date] date, [type] varchar(50));
insert into holidaytable values('uk1', '2022-01-01', 'LM');
insert into holidaytable values('uk1', '2022-01-01', 'RMC');
查询:
select e.empid, e.location, h.holidaycode, [date], max([type]) [type 1]
from employee e inner join location_table l
on e.location=l.location
inner join holidaytable h
on l.holidaycode=h.holidaycode
where e.empid=2 and h.[date]='2022-01-01'
group by e.empid, e.location, h.holidaycode, [date]
输出:
empid | location | holidaycode | date | type 1 |
---|---|---|---|---|
2 | UK | uk1 | 2022-01-01 | RMC |
db<>fiddle here
您可以使用 ROW_NUMBER
只获取每个分组的第一行。
要么 ORDER BY type DESC
要么使用 ORDER BY CASE WHEN type = 'RMC' THEN 1 ELSE 2 END
SELECT
e.empid,
e.location,
l.holidaycode,
h.date,
h.type
FROM employee e
JOIN location l ON l.location = e.location
JOIN (
SELECT *,
rn = ROW_NUMBER() OVER (PARTITION BY h.holidaycode, h.date ORDER BY h.type DESC)
FROM holiday h
) h ON h.holidaycode = l.holidaycode AND h.rn = 1
WHERE h.date = '2022-01-01';