programing

세 개의 하위 쿼리를 결합하고 교차점을 올바르게 세는 방법은 무엇입니까?

subpage 2023. 9. 1. 20:59
반응형

세 개의 하위 쿼리를 결합하고 교차점을 올바르게 세는 방법은 무엇입니까?

충성도가 높은 사용자가 몇 명인지 알고 싶습니다.이에 대한 정의는 사용자가 최소한 매월 한 번씩 로그인해야 한다는 것입니다.

사용자가 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;

결과: enter image description here

사용자가 기간별로 적어도 한 번 이상 로그인했는지 여부에만 관심이 있으므로 각 기간에 대해 사용자당 카운트를 수행할 필요가 없습니다.지정된 기간에 연결한 모든 사용자가 테이블에 나타납니다.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

반응형