programing

처음 누락될 때까지 최대 날짜를 선택하는 Mysql

javajsp 2023. 10. 1. 19:18

처음 누락될 때까지 최대 날짜를 선택하는 Mysql

월별로 첫번째 누락일까지 최대 날짜를 선택해야 합니다.

내 테이블은 이렇게 생겼습니다.

ClientID   DATE
1          2018-01-01 
1          2018-02-01 
1          2018-03-01 
1          2018-04-01 
1          2018-05-01 
1          2018-07-01 
1          2018-08-01 
1          2018-09-01 
1          2018-10-01 
1          2018-11-01 
1          2018-12-01 
2          2018-01-01    
2          2018-02-01    
2          2018-03-01    
2          2018-04-01    
2          2018-05-01    
2          2018-06-01    
2          2018-07-01    
2          2018-08-01    
2          2018-09-01    
2          2018-11-01    
2          2018-12-01    

아래와 같이 선택하는 가장 좋은 방법은 무엇입니까?

ClientID   DATE
    1      2018-05-01
    2      2018-09-01

나는 이것을 합니다.

update temporaryTable a
(SELECT max(date), clientID FROM table WHERE DATE_FORMAT(date, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m') group by clientID) b on a.clientID = b.clientID
set a.date = b.date;

update temporaryTable a
(SELECT max(date), clientID FROM table WHERE DATE_FORMAT(date, '%Y%m') = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 month), '%Y%m') group by clientID) b on a.clientID = b.clientID
set a.date = b.date
where a.date = DATE_FORMAT(NOW(), '%Y%m');

update temporaryTable a
(SELECT max(date), clientID FROM table WHERE DATE_FORMAT(date, '%Y%m') = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 2 month), '%Y%m') group by clientID) b on a.clientID = b.clientID
set a.date = b.date
where a.date = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 month), '%Y%m);

등...24개월 간격까지

나는 그것이 마음에 들지 않고 테이블에 300만개의 기록이 있어서 느립니다.

월과 날짜를 각각의 열로 분리하여 수정할 수 있었습니다.

update table set month_date=MONTH(DATE), year_date = YEAR(DATE);

그다음에 이걸 사용했습니다.

SELECT clientID, year_date, min(month_date) as date_month
FROM table a
WHERE NOT EXISTS (SELECT c.clientID, c.year_date, c.month_date
    FROM table c 
    WHERE c.month_date= a.month_date + 1
        AND c.clientID= a.clientID
        AND c.year_date= a.year_date and a.year_date= year(now()) and month_date >= 1
GROUP BY a.clientID, a.year_date

이것은 올바른 인덱스로 훨씬 더 빠르게 만들었습니다.

언급URL : https://stackoverflow.com/questions/49951008/mysql-select-max-date-untill-first-missing