반응형
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
반응형
'programing' 카테고리의 다른 글
Oracle에서 문자열의 단어 수를 계산하려면 어떻게 해야 합니까? (0) | 2023.10.28 |
---|---|
PHP/MySQL 삽입 null 값 (0) | 2023.10.28 |
post_date_gmt 대신 post_meta date 쿼리 (0) | 2023.10.23 |
Angularjs: iframe에서 다른 스코프를 호출합니다. (0) | 2023.10.23 |
안드로이드 앱에서 사용할 웹소켓 라이브러리는? (0) | 2023.10.23 |