programing

mariadb 가장 긴 동시 번호 시퀀스를 찾는 방법

mailnote 2023. 8. 14. 23:01
반응형

mariadb 가장 긴 동시 번호 시퀀스를 찾는 방법

구성원과 실행 중인 시간을 설명하는 표가 있습니다. 예:

memberid(varchar), RunNo(integer)
"1017",1868
"1017",1875
"1017",1877
"1017",1878
"1017",1879
"1017",1880
"1017",1882
"1017",1884
"1017",1885
"1017",1886
"1017",1887
"1017",1889
"1017",1894
"1017",1895
"1017",1896
"1017",1897
"1017",1902
"1017",1903
"1017",1904
"1017",1906
"1017",1907
"1017",1909
"1017",1910
"1017",1911
"1017",1929
"1017",1930
"1017",1931
"1017",1934
"1017",1935
"1079",1840
"1079",1844
"1079",1846
"1079",1847
"1079",1850
"1079",1854
"1079",1857
"1079",1859
"1079",1861
"1079",1863
"1079",1865
"1079",1866
"1079",1869
"1079",1870
"1079",1871
"1079",1872
"1079",1873
"1079",1874
"1079",1875
"1079",1876
"1079",1877
"1079",1878
"1079",1879
"1079",1880
"1079",1882
"1079",1884
"1079",1885
"1079",1886
"1079",1889
"1079",1890
"1079",1891
"1079",1893
"1079",1895
"1079",1897
"1079",1902
"1079",1903
"1079",1904
"1079",1905
"1079",1907
"1079",1908
"1079",1910
"1079",1911
"1079",1923

각 멤버 ID에 대해 각 주자에 대해 가장 긴 연속 런 번호 시퀀스가 무엇인지, 유사한 시퀀스가 여러 개 있다고 가정하고 런 번호가 날짜 순서에 있다고 가정할 때 가장 최근이고 가장 긴 시퀀스는 무엇인지 찾고 싶습니다.

예를 들어, 1017은 연속해서 최대 4개의 런을 가지며 1079는 최대 12개의 런을 갖습니다.

이것을 해결할 방법이 있어야 하는데 저는 해결책을 찾지 못했습니다.

Windows 10에서 MariaDB v10.4.22를 사용하고 있습니다.

이것은 아래와 같은 재귀적 CTE로 해결할 수 있는 문제입니다.

WITH RECURSIVE runlength AS
  (SELECT memberId AS id,
          RunNo + 1 AS next,
          1 AS length
   FROM members
   UNION ALL SELECT members.memberId,
                    RunNo+1,
                    length+1
   FROM members
   JOIN runlength ON members.memberId = runlength.id
   AND members.runNo = next)
SELECT id,
       max(length)
FROM runlength
GROUP BY id;

앵커가 이니셜을 설정합니다.runlength각 길이가 1인 초기 값과 시퀀스를 증가시킬 다음 값이 내용입니다.

  SELECT memberId AS id,
          RunNo + 1 AS next,
          1 AS length
   FROM members

재귀 부분은 시퀀스의 다음 부분을 찾고 길이를 늘립니다.

SELECT members.memberId,
                    RunNo+1,
                    length+1
   FROM members
   JOIN runlength ON members.memberId = runlength.id
   AND members.runNo = next

마지막으로 짧은 시퀀스가 너무 많기 때문에 사용자당 최대치만 사용할 수 있습니다.

SELECT id,
       max(length)
FROM runlength
GROUP BY id;

참고: 생성된 행 수가 많기 때문에 효율적인 쿼리가 아니며 소규모 데이터 세트에만 사용해야 합니다.

참조: 피들

언급URL : https://stackoverflow.com/questions/74577649/mariadb-how-to-find-longest-sequence-of-concurrent-numbers

반응형