2017-11-04 7 views
0

주어진 다음의 표 (가 세션과 사용자의 항목을보고 역사를 기록)파티션 쿼리 및 계산

create table view_log (
    server_time timestamp, 
    device char(2), 

    session_id char(10), 
    uid char(7), 
    item_id char(7) 
); 

나는 다음과 같은 코드가 무엇을 이해하려고 노력 중이 야 ..

create table coo_cs as 
select 
    item_id, 
    session_id, 
    count(distinct session_id)/(sum(count(distinct session_id)) over (partition by item_id)) cs 
from view_log 
group by item_id, session_id; 

나는 그 일을 이해하기 위해 partition으로 줄을 세우려고 시도했지만 그 후에는 DISTINCT is not implemented for window functions을 낸다.

이해 기본 partitiongroup by하지만 위의 SQL의 의미가 없습니다 ..

  • 편집 테스트 오히려 큰 데이터있다

...

http://pakdd2017.recobell.io/site_view_log_small.csv000.gz

+2

작은 입력 하위 집합을 제공하면 도움이 될 것입니다. 데이터와 해당 결과 집합 –

+0

사용중인 데이터베이스에 질문에 태그를 답니다. –

답변

0

일부 데이터베이스는 창 기능으로 count(distinct)을 지원하지 않습니다 (아직). . 이 쿼리의 경우 count(distinct)에 사용 된 것과 동일한 열을 집계하기 때문에 count(distinct)은 필요하지 않습니다. 따라서 count(distinct session_id)은 각 행마다 1입니다.

조회에 본질적 :

select item_id, session_id, 
     1.0/count(session_id) over (partition by item_id)) as cs 
from view_log 
group by item_id, session_id; 

의도 쿼리가 있도록, item_id의 수준에서 비율을 원한다면 나는 놀라운 일이되지 않을 것 :

select item_id, count(distinct session_id), 
     count(distinct session_id) * 1.0/sum(count(distinct session_id)) over()) as cs 
from view_log 
group by item_id; 

만약 그렇다면, 등가 로직은 하위 쿼리를 사용할 수 있습니다.

select vl.*, sum(numsession) over() as cs 
from (select item_id, count(distinct session_id) as numsessions 
     from view_log vl 
     group by item_id 
    ) vl; 
+0

죄송합니다. 동일한 (session_id, item_id)을 가진 여러 행이있을 수 있음을 나타 내기 위해 view_log 테이블에'server_time' 열을 추가했습니다. 나는 그것이 당신의 대답에 영향을 주는지 확신하지 못합니다 ... – eugene

+0

@eugene. . . 전혀. 'group by '에 사용 된 열의'count (distinct)'는 값이 NULL ("0"을 반환하는 경우)이 아니면 "1"을 반환합니다. –

+0

답변을 주셔서 감사합니다. 하위 쿼리는 동일한 결과를 제공하는 것 같습니다. 여전히 쿼리의 의도를 이해할 수 없습니다. 하위 쿼리는'over (partition by by) 및 group by '를 함께 볼 때 다음에'group by'을 먼저 적용하고 다음에'partition by '을 적용하여 생각할 수 있다고 제안하는 것 같습니다. 맞다면, 이미'group by '에 의해 겹쳐 져서'partition by'의 요점을 보지 못했습니다. 제 SQL 수준에서는 너무 복잡합니다. – eugene