2015-11-16 24 views
0

我有一個記錄用戶點擊的大型緩慢數據庫'LargeSlowTable'。我只有讀取權限,不能寫入,所以我不能使用Global Temporary Tables。我想統計按周分組的點擊次數。我還想計算點擊次數的不同/唯一數量。下面的代碼很好地做到了這一點。 (還有一個原因,我有嵌套在第一Select內第二Select)現在,我也想唯一的總點擊數的計數,從起始日期到本Oracle SQL |有效計算按周分組的點擊次數以及所有小計

SELECT Week, COUNT(Click), COUNT(DISTINCT Click) FROM 
(
SELECT 
Week, 
Click 
FROM LargeSlowTable 
WHERE Id = 2 
) 
GROUP BY Week 
ORDER BY Week; 

。這不僅僅是每週所有獨特點擊次數的總和,因爲這些可能會顯示同一用戶的點擊次數。因此,我需要運行另一個忽略GROUP BY Week部分的命令。

我可以在不調用LargeSlowTable的情況下做到這一點嗎?

最後,我還希望從開始日期到特定周的每週的小計次數。

我可以在不調用LargeSlowTable的情況下做到這一點嗎?

回答

1

使用row_number()以識別第一用戶點擊,然後用decodecase when爲這些新的,額外的列數僅RN = 1:

select week, cc, cdc, sum(cda) over() "all distinct clicks", 
     sum(cda) over (order by week) "distinct clicks to that week" 
    from (
    select week, count(click) cc, count(distinct click) cdc, count(decode(rn, 1, 1)) cda 
     from (
     select lt.*, row_number() over (partition by click order by week) rn 
      from largeslowtable lt where id = 2) 
     group by week) 

SQLFiddle demo

+0

哇!太好了,謝謝。 – LBogaardt

0

Oracle支持分析功能,所以你可以使用:

SELECT Week, COUNT(Click), COUNT(DISTINCT Click), 
     MAX(CumeDistinctClicks) 
FROM (SELECT Week, Click, 
      COUNT(DISTINCT click) OVER (ORDER BY Week) as CumeDistinctClicks 
     FROM LargeSlowTable 
     WHERE Id = 2 
    ) lst 
GROUP BY Week 
ORDER BY Week; 

有開銷解析函數,所以這可能不會是一樣快,你的原始查詢。

編輯:

這是奇怪的,我真的認爲,甲骨文確實支持count(distinct)窗口功能。一種替代方法使用兩個聚合:

SELECT Week, SUM(cnt), COUNT(DISTINCT Click), 
     SUM(CASE WHEN seqnum = 1 THEN 1 ELSE 0 END) as CumeDistinctClicks 
FROM (SELECT week, click, COUNT(*) as cnt, 
      ROW_NUMBER() OVER (PARTITION BY click ORDER BY week) as seqnum 
     FROM (SELECT Week, Click 
      FROM LargeSlowTable 
      WHERE Id = 2 
      ) lst 
     GROUP BY click, week 
    ) cw 
GROUP BY Week 
ORDER BY Week; 
+0

謝謝,但: ORA-30487:此處不允許ORDER BY 30487. 00000 - 「ORDER BY BY NOT allowed here」 *原因:DISTINCT函數和RATIO_TO_REPORT不能有ORDER BY *操作: Error at Line:3列:68 – LBogaardt