![](/img/trans.png)
[英]SQL Snowflake Min Date For Each Record & Group By Month
[英]sql to find row for min date in each month
我有一張桌子,用結構說“記錄”:
id date
-- ----
1 2012-08-30
2 2012-08-29
3 2012-07-25
我需要在PostgreSQL中編寫一個SQL查詢以獲取每個月的MIN日期的record_id。
month record_id
----- ---------
8 2
7 3
正如我們看到的2012-08-29 <2012-08-30,它是8個月,所以我們應該顯示record_id = 2
我嘗試過這樣的事情
SELECT
EXTRACT(MONTH FROM date) as month,
record_id,
MIN(date)
FROM Records
GROUP BY 1,2
但它顯示3條記錄。
有人可以幫忙嗎?
SELECT DISTINCT ON (EXTRACT(MONTH FROM date))
id,
date
FROM Records1
ORDER BY EXTRACT(MONTH FROM date),date
SQLFiddle http://sqlfiddle.com/#!12/76ca2/3
UPD:此查詢:
1)按月和日期排序記錄
2)每月選擇第一條記錄(由於訂購,第一條記錄具有MIN(date)
)
此處的詳細信息http://www.postgresql.org/docs/current/static/sql-select.html#SQL-DISTINCT
select distinct on (date_trunc('month', date))
date_trunc('month', date) as month,
id,
date
from records
order by 1, 3 desc
如果您有重復的最小日期,則將返回倍數:
Select
minbymonth.Month,
r.record_id
From (
Select
Extract(Month From date) As Month,
Min(date) As Date
From
records
Group By
Extract(Month From date)
) minbymonth
Inner Join
records r
On minbymonth.date = r.date
Order By
1;
或者如果您有CTE
With MinByMonth As (
Select
Extract(Month From date) As Month,
Min(date) As Date
From
records
Group By
Extract(Month From date)
)
Select
m.Month,
r.record_id
From
MinByMonth m
Inner Join
Records r
On m.date = r.date
Order By
1;
select extract(month from date)
, record_id
, date
from
(
select
record_id
, date
, rank() over (partition by extract(month from date) order by date asc) r
from records
) x
where r=1
order by date
我認為您需要使用子查詢,如下所示:
SELECT
EXTRACT(MONTH FROM r.date) as month,
r.record_id
FROM Records as r
INNER JOIN (
SELECT
EXTRACT(MONTH FROM date) as month,
MIN(date) as mindate
FROM Records
GROUP BY EXTRACT(MONTH FROM date)
) as sub on EXTRACT(MONTH FROM r.date) = sub.month and r.date = sub.mindate
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.