2014-02-12 84 views
11

是否可以将不同的值与OVER(PARTITION BY id)等窗口函数一起计数?目前我的查询如下:用OVER(PARTITION BY ID)计算不同的值

SELECT congestion.date, congestion.week_nb, congestion.id_congestion, 
    congestion.id_element, 
ROW_NUMBER() OVER(
    PARTITION BY congestion.id_element 
    ORDER BY congestion.date), 
COUNT(DISTINCT congestion.week_nb) OVER(
    PARTITION BY congestion.id_element 
) AS week_count 
FROM congestion 
WHERE congestion.date >= '2014.01.01' 
AND congestion.date <= '2014.12.31' 
ORDER BY id_element, date 

然而,当我尝试执行查询,我得到了以下错误:

"COUNT(DISTINCT": "DISTINCT is not implemented for window functions" 

回答

1

没有,作为错误消息状态,DISTINCT与Windows不执行功能。 Aplying从this link信息到你的情况,你可以使用类似:

WITH uniques AS (
SELECT congestion.id_element, COUNT(DISTINCT congestion.week_nb) AS unique_references 
FROM congestion 
WHERE congestion.date >= '2014.01.01' 
AND congestion.date <= '2014.12.31' 
GROUP BY congestion.id_element 
) 

SELECT congestion.date, congestion.week_nb, congestion.id_congestion, 
    congestion.id_element, 
ROW_NUMBER() OVER(
    PARTITION BY congestion.id_element 
    ORDER BY congestion.date), 
uniques.unique_references AS week_count 
FROM congestion 
JOIN uniques USING (id_element) 
WHERE congestion.date >= '2014.01.01' 
AND congestion.date <= '2014.12.31' 
ORDER BY id_element, date 

根据不同的情况,你也可以把一个子查询直冲SELECT -list:

SELECT congestion.date, congestion.week_nb, congestion.id_congestion, 
    congestion.id_element, 
ROW_NUMBER() OVER(
    PARTITION BY congestion.id_element 
    ORDER BY congestion.date), 
(SELECT COUNT(DISTINCT dist_con.week_nb) 
    FROM congestion AS dist_con 
    WHERE dist_con.date >= '2014.01.01' 
    AND dist_con.date <= '2014.12.31' 
    AND dist_con.id_element = congestion.id_element) AS week_count 
FROM congestion 
WHERE congestion.date >= '2014.01.01' 
AND congestion.date <= '2014.12.31' 
ORDER BY id_element, date 
0

我发现,最简单的方法是使用子查询/ CTE和条件聚合:

SELECT c.date, c.week_nb, c.id_congestion, c.id_element, 
     ROW_NUMBER() OVER (PARTITION BY c.id_element ORDER BY c.date), 
     (CASE WHEN seqnum = 1 THEN 1 ELSE 0 END) as week_count 
FROM (SELECT c.*, 
      ROW_NUMBER() OVER (PARTITION BY c.congestion.id_element, c.week_nb 
           ORDER BY c.date) as seqnum 
     FROM congestion c 
    ) c 
WHERE c.date >= '2014.01.01' AND c.date <= '2014.12.31' 
ORDER BY id_element, date 
相关问题