세 개의 하위 쿼리를 결합하고 교차점을 올바르게 세는 방법은 무엇입니까?
충성도가 높은 사용자가 몇 명인지 알고 싶습니다.이에 대한 정의는 사용자가 최소한 매월 한 번씩 로그인해야 한다는 것입니다.
사용자가 2018-08-21과 2018-09-21 사이에 한 번, 2018-09-21과 2018-10-21 사이에 한 번, 2018-10-21과 2018-11-21 사이에 한 번 로그인한 경우 이는 충성도가 높은 사용자입니다.
저는 이 세 개의 시간 정의 하위 쿼리에 참여하는 것이 가장 좋은 방법이라고 생각했습니다.하지만 나는 그것을 어떻게 세는지에 집착합니다.각 하위 쿼리는 서로 다른 카운트를 표시합니다.제가 가장 낮은 값을 교차로로 고려해야 하나요?아니면 제가 완전히 잘못하고 있는 건가요?
select p.country, round(SUM(a.GBytes+b.GBytes+c.GBytes), 2) as `Traffic`, a.Count, b.Count , c.Count
from (
SELECT username,
SUBSTRING_INDEX( callingstationid, '=', 1 ) as IP,
(SUM(`acctinputoctets`)+SUM(`acctoutputoctets`))/1000/1000/1000 as GBytes,
count(username) as Count
FROM radacct
WHERE (`acctstarttime` BETWEEN '2018-08-21 22:13:54.286223' AND '2018-09-21 22:13:54.286223')
GROUP BY username
) a join (
SELECT username,
SUBSTRING_INDEX( callingstationid, '=', 1 ) as IP,
(SUM(`acctinputoctets`)+SUM(`acctoutputoctets`))/1000/1000/1000 as GBytes,
count(username) as Count
FROM radacct
WHERE (`acctstarttime` BETWEEN '2018-09-21 22:13:54.286223' AND '2018-10-21 22:13:54.286223')
GROUP BY username
) b on a.username = b.username
join (
SELECT username,
SUBSTRING_INDEX( callingstationid, '=', 1 ) as IP,
(SUM(`acctinputoctets`)+SUM(`acctoutputoctets`))/1000/1000/1000 as GBytes,
count(username) as Count
FROM radacct
WHERE (`acctstarttime` BETWEEN '2018-10-21 22:13:54.286223' AND '2018-11-21 22:13:54.286223')
GROUP BY username
) c on b.username = c.username
join cache_db.global_ip p on p.ip = a.IP
join cache_db.global_ip p2 on p2.ip = b.IP
join cache_db.global_ip p3 on p3.ip = c.IP
group by country;
사용자가 기간별로 적어도 한 번 이상 로그인했는지 여부에만 관심이 있으므로 각 기간에 대해 사용자당 카운트를 수행할 필요가 없습니다.지정된 기간에 연결한 모든 사용자가 테이블에 나타납니다.a
,b
또는c
각각 그리고 당신이 그렇기 때문에.JOIN
그것들을 하나로 묶는 것.username
필드에는 세 시간 동안 모두 로그인한 사용자만 결과 집합에 표시됩니다.따라서 단순한COUNT(*)
외부 질문에서 (대신)a.Count, b.Count , c.Count
)에서 원하는 결과를 제공합니다.
같다면,username
다른 나라에서 사용될 수 있고, 그러면 당신은 그룹화할 필요가 있을 것입니다.username
그리고.country
각 하위 질의에서 참여합니다.username
그리고.country
뿐만 아니라.
언급URL : https://stackoverflow.com/questions/53425767/how-to-join-three-subqueries-and-count-the-intersection-correctly
'programing' 카테고리의 다른 글
Angular 4에서 모듈 'typescript'를 찾을 수 없음을 해결하는 방법은 무엇입니까? (0) | 2023.09.01 |
---|---|
Excel에서 워크시트 이벤트 이름 바꾸기 (0) | 2023.09.01 |
요소가 화면 밖에 있는지 확인하는 방법 (0) | 2023.09.01 |
MariaDB 예기치 않은 토큰이 반환될 것 같습니다. (0) | 2023.09.01 |
두 테이블 간 하위 쿼리를 기반으로 한 Oracle SQL 업데이트 (0) | 2023.08.27 |