如何在连接查询中应用 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';

db<>fiddle