在我的 postgres 資料庫中,我有一個包含my_table列的表ean,,pricedtmod
| 恩 | 價格 | dtmod |
|---|---|---|
| 155105 | 2.19 | 2022-06-22 03:03:25.43045 02 |
| 155105 | -0.01 | 2022-06-28 02:27:15.478475 02 |
| 155105 | 1.45 | 2022-06-28 15:11:35.558692 02 |
| 114695 | -0.01 | 2022-06-28 02:27:15.448782 02 |
| 114695 | 5.99 | 2022-06-28 15:11:27.689637 02 |
| 213786 | -0.01 | 2022-06-28 02:27:15.468477 02 |
| 213786 | 2.39 | 2022-06-28 15:11:32.284314 02 |
如何過濾此表中的資料以獲取dtmod每個唯一ean(并顯示price)的最新資料,按 排序ean?
預期輸出:
| 恩 | 價格 | dtmod |
|---|---|---|
| 114695 | 5.99 | 2022-06-28 15:11:27.689637 02 |
| 155105 | 1.45 | 2022-06-28 15:11:35.558692 02 |
| 213786 | 2.39 | 2022-06-28 15:11:32.284314 02 |
我找到了一個可能的解決方案,但我認為這不是最簡潔和有效的解決方案。
第 1 步:
提取所有 ean 的最新日期
select ean, max(dtmod)
from my_table
group by ean;
ean | max -------- ------------------------------- 155105 | 2022-06-28 15:11:35.558692 02 114695 | 2022-06-28 15:11:27.689637 02 213786 | 2022-06-28 15:11:32.284314 02
第 2 步:
從 my_table 中提取 ean、price 和 dtmod,其中 ean 和 price 與上一個查詢的結果匹配
select ean, price, dtmod
from my_table
where (ean, dtmod) in
(
select ean, max(dtmod)
from my_table
group by ean
)
order by ean;
ean | price | dtmod -------- -------- ------------------------------ 114695 | 5.99 | 2022-06-28 15:11:27.689637 02 155105 | 1.45 | 2022-06-28 15:11:35.558692 02 213786 | 2.39 | 2022-06-28 15:11:32.284314 02
關于如何改進查詢的任何建議?
uj5u.com熱心網友回復:
您的查詢將是這樣的
SELECT DISTINCT ON (ean)
ean,
LAST_VALUE(price) OVER (PARTITION BY ean ORDER BY dtmod DESC) AS price,
MAX(dtmod) OVER (PARTITION BY ean) AS dtmod
FROM my_table
小提琴
uj5u.com熱心網友回復:
您可以使用方便的FETCH FIRST <n> ROWS WITH TIES子句,結合排名,由每個“ ean ”的最大 dtmod 給出。
SELECT *
FROM tab
ORDER BY ROW_NUMBER() OVER(PARTITION BY ean ORDER BY dtmod DESC)
FETCH FIRST 1 ROWS WITH TIES
在此處查看演示。
uj5u.com熱心網友回復:
執行此操作的經典方法,在這種情況下仍然非常有用:
select
ean,
price,
dtmod
from my_table t0
where
t0.dtmod = (
select max(dtmod)
from my_table t1
where t1.ean = t0.ean
)
order by ean
;
另外,對每個人都非常有幫助的是知道如何使用視窗函式,任何 SQL 程式員都應該花一些時間來了解所有的視窗函式。
with
w_o as (
select
ean,
price,
dtmod,
row_number() OVER (PARTITION BY ean ORDER BY dtmod DESC) rn
from my_table
)
select
ean,
price,
dtmod
from w_o
where rn = 1
order by ean
;
筆記:
為了測驗,我在測驗資料中添加了一條具有相同 EAN 和相同時間戳的重復記錄。第一個查詢同時給出第二個查詢只給出一個。您可以通過調整排序來確定它回傳哪一個。
編輯 1. 我忘記了訂單。:)
編輯 2. 添加視窗功能資訊。
http://sqlfiddle.com/#!17/8278a/1/1
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/497544.html
標籤:sql PostgreSQL 每组最大 n
