這就是我的資料的樣子:
| 物品 | 年 | 價錢 |
|---|---|---|
| 帽子 | 2020 | 15 |
| 帽子 | 2021 | 17 |
| 帽子 | 2022 | 19 |
| 筆 | 2020 | 3 |
| 筆 | 2021 | 2 |
| 筆 | 2022 | 3.3 |
我想使用 PostgreSQL 來實作一個簡單的資料分析任務,它將提供以下結果:
| 物品 | 年 | 價錢 | 上一年 | 以前的價格 | 高于上一個年份 |
|---|---|---|---|---|---|
| 帽子 | 2020 | 15 | |||
| 帽子 | 2021 | 17 | 2020 | 15 | 是的 |
| 帽子 | 2022 | 19 | 2021 | 17 | 是的 |
| 筆 | 2020 | 3 | |||
| 筆 | 2021 | 2 | 2020 | 3 | 不 |
| 筆 | 2022 | 3.3 | 2021 | 2 | 是的 |
上一年:獲取小于年份列中指定的當前年份的最近年份。 上一價格:獲取與上一年對應的商品的價格。 Higher_than_previous_year:將價格列與上一價格列進行比較,當價格高于上一價格時計算是,當上一價格高于當年價格時計算否。
如果任何 PostgreSQL 大師能對此有所了解,我將不勝感激。謝謝!
uj5u.com熱心網友回復:
只需使用滯后視窗功能,它可以讓您回顧前一行。由于這需要多次回溯操作,因此您在查詢中定義和使用 WINDOW 定義。(見演示)
select item, year, price
, lag(year) over w previous_year
, lag(price) over w previous_price
, case when price > lag(price) over w then 'Yes'
when lag(price) over w is null then null::text
else 'No'
end higher_than_previous_year
from origin
window w as (partition by item order by year);
uj5u.com熱心網友回復:
您可以使用 simpleJOINS來UNION實作此目的(多種方法之一):
詢問:
SELECT
a.item,
a.year,
a.price,
NULL AS prev_year,
NULL AS prev_price,
NULL AS higher_than_previous_year
FROM
(
Select *, ROW_NUMBER() OVER (PARTITION BY Item ORDER BY Year) as rn
from t
) as a
WHERE rn=1
UNION
SELECT
a.item,
a.year,
a.price,
b.year as prev_year,
b.price as prev_price,
CASE
WHEN a.price > b.price THEN 'yes'
ELSE 'No'
END AS higher_than_previous_year
FROM
(
Select *, ROW_NUMBER() OVER (PARTITION BY Item ORDER BY Year) as rn
from t
) as a
LEFT JOIN
(
Select *, ROW_NUMBER() OVER (PARTITION BY Item ORDER BY Year) as rn
from t
) as b
ON a.item=b.item and a.rn=b.rn 1
WHERE a.rn>1
解釋:
- 首先創建一個
ROW_NUM列來查找前一行 - 在所有地方使用同一個表,FROM并且JOIN正在使用 - 上圖
UNION:使用 1 獲取行,因為它們很容易繼續 - 下面
UNION:自我加入表格以獲取它的上一個值
參見db<>fiddle 中的 fiddle
如果您有權訪問,我建議您創建intermediate tables以便查詢看起來更簡單。請參閱此小提琴(創建中間表,以便查詢易于理解和除錯)
uj5u.com熱心網友回復:
我之前在對@arun 解決方案的評論之一中說過,有一個名為“類別”的額外列。我發現這個查詢效果最好。
SELECT *,
CASE WHEN price > previous_price THEN 'yes'
WHEN price <= previous_price THEN 'no'
ELSE null
END AS is_current_year_price_higher
FROM
(
SELECT *,
LAG(year,1) OVER (PARTITION BY item, category ORDER BY item, year) AS previous_year,
LAG(price,1) OVER (PARTITION BY item, category ORDER BY item, year) AS previous_price
FROM table_name
) AS main
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/441847.html
標籤:sql PostgreSQL 数据分析
下一篇:PostgreSQL查找持續時間
