PostgreSQL 汇总统计与窗口函数
Michel Semaan
Data Scientist
LAG(column, n) 返回当前行之前第 n 行的 column 值LEAD(column, n) 返回当前行之后第 n 行的 column 值FIRST_VALUE(column) 返回表或分区中的首个值LAST_VALUE(column) 返回表或分区中的最后一个值查询
WITH Hosts AS (
SELECT DISTINCT Year, City
FROM Summer_Medals)
SELECT
Year, City,
LEAD(City, 1) OVER (ORDER BY Year ASC)
AS Next_City,
LEAD(City, 2) OVER (ORDER BY Year ASC)
AS After_Next_City
FROM Hosts
ORDER BY Year ASC;
结果
| Year | City | Next_City | After_Next_City |
|------|-----------|-----------|-----------------|
| 1896 | Athens | Paris | St Louis |
| 1900 | Paris | St Louis | London |
| 1904 | St Louis | London | Stockholm |
| 1908 | London | Stockholm | Antwerp |
| 1912 | Stockholm | Antwerp | Paris |
| ... | ... | ... | ... |
查询
SELECT
Year, City,
FIRST_VALUE(City) OVER
(ORDER BY Year ASC) AS First_City,
LAST_VALUE(City) OVER (
ORDER BY Year ASC
RANGE BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
) AS Last_City
FROM Hosts
ORDER BY Year ASC;
结果
| Year | City | First_City | Last_City |
|------|-----------|------------|-----------------|
| 1896 | Athens | Athens | London |
| 1900 | Paris | Athens | London |
| 1904 | St Louis | Athens | London |
| 1908 | London | Athens | London |
| 1912 | Stockholm | Athens | London |
RANGE BETWEEN ... 可将窗口扩展到表或分区的末尾LEAD(Champion, 1),未使用 PARTITION BY| Year | Event | Champion | Next_Champion |
|------|--------------|----------|---------------|
| 2004 | Discus Throw | LTU | EST |
| 2008 | Discus Throw | EST | GER |
| 2012 | Discus Throw | GER | SWE |
| 2004 | Triple Jump | SWE | POR |
| 2008 | Triple Jump | POR | USA |
| 2012 | Triple Jump | USA | null |
LEAD(Champion, 1),使用 PARTITION BY Event| Year | Event | Champion | Next_Champion |
|------|--------------|----------|---------------|
| 2004 | Discus Throw | LTU | EST |
| 2008 | Discus Throw | EST | GER |
| 2012 | Discus Throw | GER | null |
| 2004 | Triple Jump | SWE | POR |
| 2008 | Triple Jump | POR | USA |
| 2012 | Triple Jump | USA | null |
FIRST_VALUE(Champion),未使用 PARTITION BY Event| Year | Event | Champion | First_Champion |
|------|--------------|----------|----------------|
| 2004 | Discus Throw | LTU | LTU |
| 2008 | Discus Throw | EST | LTU |
| 2012 | Discus Throw | GER | LTU |
| 2004 | Triple Jump | SWE | LTU |
| 2008 | Triple Jump | POR | LTU |
| 2012 | Triple Jump | USA | LTU |
FIRST_VALUE(Champion),使用 PARTITION BY Event| Year | Event | Champion | First_Champion |
|------|--------------|----------|----------------|
| 2004 | Discus Throw | LTU | LTU |
| 2008 | Discus Throw | EST | LTU |
| 2012 | Discus Throw | GER | LTU |
| 2004 | Triple Jump | SWE | SWE |
| 2008 | Triple Jump | POR | SWE |
| 2012 | Triple Jump | USA | SWE |
PostgreSQL 汇总统计与窗口函数