簡體   English   中英

在 Postgres 中使用連接指定窗口函數

[英]Specifying window functions with joins in Postgres

我在 Postgres 中使用此 SQL 命令遇到語法錯誤,但它似乎與SELECT 文檔中指定的命令語法相匹配

select *, 
       row_number() over w 
from units 
   left outer join leases 
window w AS (partition by units.id order by leases.start desc)

就我所見,這與表示我可以編寫以下形式的任何 SQL 語句的語法相匹配:

SELECT * 
from (table joins) 
WINDOW window_name AS (window_definition)

然而 SQL 告訴我leaseswindow之間存在錯誤。 有什么錯誤? 為什么我誤讀了文檔?

這是錯誤:

2020-03-27 23:02:11.644 PDT [47717] ERROR:  syntax error at or near "WINDOW" at character 66
2020-03-27 23:02:11.644 PDT [47717] STATEMENT:  select *, row_number() over w from  units left outer join leases WINDOW w AS (partition by units.id order by leases.start desc)
ERROR:  syntax error at or near "WINDOW"
LINE 1: ...umber() over w from  units left outer join leases WINDOW w A...
                                                             ^

為了澄清我的問題,我對其進行了編輯,以將窗口函數實際添加到 SELECT 列表中,盡管根據 Postgresql SQL 規范這不是必需的。 無論如何,添加函數並不能解決語法錯誤; 它仍然在同一地點。

正如 hwnn 所評論的,由於您使用了 WINDOW,您的 sql 沒有錯誤,這是因為您沒有為連接放置任何謂詞

select *, 
   row_number() over w 
from 
  units u
  left outer join leases l on u.id = l.unitid
  --                       ^^^^^^^^^^^^^^^^^^
window w AS (partition by u.id order by l.start desc)

如果您的目標是提高您的 sql 知識,您可能希望跳過使用 WINDOW 子句,因為(據我所知)並非所有 DBMS 都支持它; 當有更普遍實現的變體可用時,學習僅由某些供應商實現的語法對您來說是不必要的限制

select *, 
   row_number() over (partition by u.id order by l.start desc) 
from
  units u
  left outer join leases l on u.id = l.unitid

你想做什么? 您沒有使用任何窗口函數。

所以語法很簡單:

select *
from units u left outer join
     leases l 
     on <join conditions here>

window子句將用於如果你有一個窗口的功能,如row_number()over子句。

您可以在from子句之后添加window子句:

select *,
       row_number() over w 
from units u left outer join
     leases l 
     on <join conditions here>
window w as (partition by u.id order by l.start desc);

除非您要多次引用它,否則不需要它,因此通常使用它:

select *,
       row_number() over (partition by u.id order by l.start desc)
from units u left outer join
     leases l 
     on <join conditions here>;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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