문제 설명
MySQL (버전 8.0 이하) : 날짜 값을 선택하고 마일스톤 날짜 테이블에서 날짜 행을 반환합니다. (MySQL (version lower then 8.0) : Select where date value and return a row of dates from table of milestone date)
표 B의 각 행에서. ins_date 및 emp_id의 열을 결정하십시오. 그런 다음 해당 값을 사용하여 표 A에서 바닥 날짜인 날짜를 선택합니다. 그런 다음 목록에 결과를 표시합니다.</p>
예:
행 1: 테이블 B. ins_date 값은 '2022‑01‑20'이고 emp_id는 2입니다. emp_id = 고려 2 및 바닥 날짜가 '2022‑01‑20'(2022‑01‑20보다 큼)이므로 항목 PK_ID = 1을 선택합니다.
2행: 테이블 B. ins_date 값은 ' 2019‑03‑30'이고 emp_id는 2입니다. emp_id = 2이고 바닥 날짜가 '2018‑06‑29'(2018‑06‑29보다 크지만 2021‑03‑23보다 작음)이므로 항목 PK_ID를 선택합니다. = 3.
3행: 테이블 B. ins_date 값은 '2017‑06‑29'이고 emp_id는 3입니다. emp_id = 3이고 바닥 날짜가 '2016‑02‑17'(2016‑02‑17보다 크고 2018‑01‑15보다 작음)이므로 PK_ID = 5 항목을 선택합니다.
영어로 감사하고 죄송합니다.
PS 질문과 세부 사항을 어떻게 설명해야 할지 모르겠습니다. 그러나 텍스트를 이해하기 쉽게 편집하는 경우. 편집을 강력히 허용합니다.
참조 솔루션
방법 1:
You are looking for the maximum milestone_date that is less or equal to an ins_date.
Two ways to get that date:
option #1
select b.*, max(a.milestone_date) as floor_milestone_date
from b
join a on a.emp_id = b.emp_id and a.milestone_date <= b.ins_date
group by b.pk_id
order by b.pk_id;
option #2
select
b.*,
(
select max(a.milestone_date)
from a
where a.emp_id = b.emp_id and a.milestone_date <= b.ins_date
) as floor_milestone_date
from b;
The difference between the two queries above: When there is no floor milestone date for an ins_date, then the first query doesn't return the b row, while the second query returns the b row with a null milestone date.
Now, if you want more information from table a, then join the table to one of the queries above.
The final query
select ab.*, a.pk_id
from
(
select b.*, max(a.milestone_date) as floor_milestone_date
from b
join a on a.emp_id = b.emp_id and a.milestone_date <= b.ins_date
group by b.pk_id
) ab
join a on a.emp_id = ab.emp_id and a.milestone_date = ab.floor_milestone_date
order by ab.pk_id;
(by Hacker Dewdie、Thorsten Kettner)