programing

Mysql: 레코드 수를 가져옵니다.

muds 2023. 10. 28. 08:17
반응형

Mysql: 레코드 수를 가져옵니다.

2개의 MariaDB(Ver 15.1 Distribution 5.5.64-MariaDB, 리눅스(x86_64)용) 테이블이 있습니다.

CREATE TABLE Table1
    (`phone` int, `calldate` datetime)
;

INSERT INTO Table1
    (`phone`, `calldate`)
VALUES
    (123, '2020-01-01 10:00:00'),
    (123, '2020-01-01 11:00:00'),
    (123, '2020-01-01 12:00:00')
;

CREATE TABLE Table2
    (`phone` int, `calldate` datetime)
;

INSERT INTO Table2
    (`phone`, `calldate`)
VALUES
( 123, '2020-01-01 09:01:00'),
( 123, '2020-01-01 09:02:00'),
( 123, '2020-01-01 10:15:00'),
( 123, '2020-01-01 10:20:00'),
( 123, '2020-01-01 10:23:00'),
( 123, '2020-01-01 11:05:00'),
( 123, '2020-01-01 11:12:00'),
( 123, '2020-01-01 11:25:00')
;

결과를 얻는 방법 : 표 1에서 첫 번째 레코드의 콜 날짜(2020-01-01 10:00)가 표 2에서 두 레코드의 콜 날짜보다 늦습니다.두 번째 레코드도 마찬가지로 카운트는 5입니다(09:01:00 ~ 10:23:00). 그러나 호출 날짜가 09:01:00 및 09:02:00인 테이블 2의 두 레코드는 테이블 1의 첫 번째 레코드에 의해 이미 "중첩"되었으므로 결과는 5가 아니라 3이어야 합니다.

|------+----------------------+-------+
| phone | calldate            | count |
|-------+---------------------+-------+
| 123   | 2020-01-01 09:02:00 | 2     |
| 123   | 2020-01-01 10:23:00 | 3     |
| 123   | 2020-01-01 11:25:00 | 3     |
|------+---------------------+|------+|

또한 결과 집합의 호출 날짜는 "중복된" 부분 집합에서 가장 마지막 호출 날짜여야 합니다.

창 기능을 사용하여 이 작업을 수행할 수 있습니다.

select t1.phone, t1.calldate, count(t2.phone)
from (select t1.*,
             lead(calldate) over (partition by phone order by calldate) as next_calldate
      from table1 t1
     ) t1 left join
     table2 t2
     on t2.phone = t1.phone and
        t2.calldate >= t1.calldate and
        (t2.calldate < t1.next_calldate or t1.next_calldate is null)
group by t1.phone, t1.calldate;

편집:

상관된 하위 쿼리를 사용하여 동일한 아이디어를 따를 수 있습니다.

select t1.phone, t1.calldate, count(t2.phone)
from (select t1.*,
             (select min(tt1.calldate)
              from table1 tt1
              where tt1.calldate > t1.calldate
             ) as next_calldate
      from table1 t1
     ) t1 left join
     table2 t2
     on t2.phone = t1.phone and
        t2.calldate >= t1.calldate and
        (t2.calldate < t1.next_calldate or t1.next_calldate is null)
group by t1.phone, t1.calldate;

이것은 윈도우 기능 버전보다 훨씬 효율성이 떨어집니다.

테이블에 참여하여 사용NOT EXISTS에서ON다음과 같은 조항:

select t1.phone, t1.calldate, count(t2.calldate) count
from Table1 t1 left join Table2 t2
on t2.phone = t1.phone and t2.calldate < t1.calldate
and not exists (
  select 1 from Table1
  where calldate < t1.calldate and t2.calldate < calldate
)  
group by t1.phone, t1.calldate

데모 보기.
결과:

| phone | calldate            | count |
| ----- | ------------------- | ----- |
| 123   | 2020-01-01 10:00:00 | 2     |
| 123   | 2020-01-01 11:00:00 | 3     |
| 123   | 2020-01-01 12:00:00 | 3     |

언급URL : https://stackoverflow.com/questions/61618423/mysql-get-count-of-records

반응형