use*_*007 17 postgresql window-functions
是否可以结合窗口函数计算不同的值,如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
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试执行查询时,我收到以下错误:
"COUNT(DISTINCT": "DISTINCT is not implemented for window functions"
Run Code Online (Sandbox Code Playgroud)
否,如错误消息所述,DISTINCT不是使用Windows函数实现的。通过此链接将信息应用于您的案例,您可以使用类似以下内容的方法:
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
Run Code Online (Sandbox Code Playgroud)
根据情况,您还可以将子查询直接放入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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25334 次 |
| 最近记录: |