簡體   English   中英

如何在Redshift中使用window function?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM