![](/img/trans.png)
[英]Window function is not allowed in where clause redshift
[英]How to use window function in Redshift?
我有 2 個表: | 產品 | |:----: | | 產品編號 | | 來源編號|
來源 |
---|
源碼 |
優先 |
有時在某些情況下,1 個 product_id 可以包含很少的來源,而我的任務是 select 數據,優先級最低,例如 | 產品編號 | 來源編號| 優先級| |:----: |:------:|:-----:| | 10| 2| 9| | 10| 4| 2| | 20| 2| 9| | 20| 4| 2| | 30| 2| 9| | 30| 4| 2|
正確的結果應該是這樣的:| 產品編號 | 來源編號| 優先級| |:----: |:------:|:-----:| | 10| 4| 2| | 20| 4| 2| | 30| 4| 2|
我正在使用查詢:
SELECT p.product_id, p.source_id, s.priority FROM Product p
INNER JOIN Source s on s.source_id = p.source_id
WHERE s.priority = (SELECT Min(s1.priority) OVER (PARTITION BY p.product_id) FROM Source s1)
但它返回錯誤“尚未支持這種類型的相關子查詢模式”所以據我所知我不能在 Redshift 中使用這種變體,應該如何解決,還有其他方法嗎?
您只需要將 where 子句展開到第二個數據源中,最小優先級的最簡單標志是使用 ROW_NUMBER() window function。您要求 Redshift 為每個 JOIN ON 測試重新運行 window function,這會創建很多集群數據庫效率低下。 嘗試以下(未經測試):
SELECT p.product_id, p.source_id, s.priority
FROM Product p
INNER JOIN (
SELECT ROW_NUMBER() OVER (PARTITION BY p.product_id, order by s1.priority) as row_num,
source_id,
priority
FROM Source) s
on s.source_id = p.source_id
WHERE row_num = 1
現在 window function 只運行一次。 如果提高整個案例的可讀性,您還可以將子查詢移動到 CTE。
已經為這種情況找到了最佳解決方案:
SELECT
p.product_id
, p.source_id
, s.priority
, Min(s.priority) OVER (PARTITION BY p.product_id) as min_priority
FROM Product p
INNER JOIN Source s
ON s.source_id = p.source_id
WHERE s.priority = p.min_priority
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.