programing

날짜당 여러 개가 존재하는 경우 개최되는 레슨/이벤트 수를 보다 간결하게 계산하는 방법

closeapi 2023. 6. 5. 23:54
반응형

날짜당 여러 개가 존재하는 경우 개최되는 레슨/이벤트 수를 보다 간결하게 계산하는 방법

이는 질문을 위한 예이지만 기본적으로 다음과 유사한 MySQL 데이터가 있습니다.

아이디 레슨 날짜 사용자 ID 주제
1234 2021-01-11 1 스페인어
1235 2021-01-11 1 스페인어
1236 2021-01-11 2 스페인어
1237 2021-01-12 1 음악
1238 2021-01-12 1 음악
1239 2021-01-12 1 음악
1240 2021-01-12 3 음악
1241 2021-01-12 3 음악
1242 2021-01-13 2 화학
1243 2021-01-13 3 화학
1244 2021-01-13 2 스페인어
1245 2021-01-14 3 수학

이는 다음을 의미하는 것으로 해석됩니다.

  • 1명은 1월 11일에 두 번의 스페인어 수업을 받았습니다(2명은 그 중 하나에 참석했습니다).
  • 1명은 1월 12일에 3번의 음악 수업이 있었습니다 (3명은 그 중 2번의 수업에 참석했습니다)
  • 1월 13일에 2인과 3인은 화학 수업을 공유했고, 2인만 그날 스페인어를 갔습니다.

원하는 출력을 얻기 위해 현재 다음과 같은 4단계 그룹화를 사용하고 있습니다.환자-개인-날짜별 카운트로 시작하여 날짜별 최대 환자 수, 환자별 총 수, 마지막으로 각 총 수에 대한 제목을 나열합니다.

SELECT LessonsHeld, GROUP_CONCAT(Subject ORDER BY Subject SEPARATOR ', ') AS Subjects FROM
    (SELECT Subject, SUM(DayCount) AS LessonsHeld FROM
        (SELECT Subject, LessonDate, MAX(PersonDayCount) AS DayCount FROM
            (SELECT Subject, LessonDate, PersonID, COUNT(*) AS PersonDayCount FROM `lessons`
            GROUP BY Subject, LessonDate, PersonID) x           
        GROUP BY Subject, LessonDate) y     
    GROUP BY Subject) z
GROUP BY LessonsHeld
ORDER BY LessonsHeld DESC

출력:

[LessonsHeld]    [Subjects]
3                Music, Spanish
1                Chemistry, Mathematics

사람들의 여러 이벤트/클래스 등을 더 간결하게 셀 수 있는 방법이 있습니까?특정 날짜에 개최됩니까?4단계의GROUP BY여기서는 좀 극단적으로 보입니다.

단일 이벤트에 대한 ID가 여러 개인 이유는 각 참석자가 자신의 데이터를 입력하고 삭제할 수 있기 때문입니다.저는 시작 시간을 기억하거나 서로의 출석률을 맞추는 것과 같은 추가적인 일을 시키는 것보다 데이터 입력을 최소화하는 데 중점을 두었습니다.

MySql 8.0은 창 기능을 지원하므로 조금 더 짧을 수 있습니다.

SELECT LessonsHeld, GROUP_CONCAT(Subject ORDER BY Subject SEPARATOR ', ') AS Subjects 
FROM
    (SELECT Subject, SUM(DayCount) AS LessonsHeld 
     FROM 
           (SELECT Subject, LessonDate,  
               max(COUNT(*)) over(partition by Subject, LessonDate) AS DayCount,
               row_number() over(partition by Subject, LessonDate order by PersonID) rn
            FROM `lessons`
            GROUP BY Subject, LessonDate, PersonID
            ) x  
    where rn = 1      
    GROUP BY Subject) z
GROUP BY LessonsHeld
ORDER BY LessonsHeld DESC;

더 나은 성능을 발휘할지 확신할 수 없습니다.

MariaDB 10.3 피들

언급URL : https://stackoverflow.com/questions/70411931/more-concise-way-to-count-no-of-lessons-events-held-if-multiple-per-date-exist

반응형