sql查找每个月的最小日期行
我有一个表,比如说“记录”的结构:sql查找每个月的最小日期行,sql,postgresql,min,Sql,Postgresql,Min,我有一个表,比如说“记录”的结构: id date -- ---- 1 2012-08-30 2 2012-08-29 3 2012-07-25 我需要在PostgreSQL中编写一个SQL查询,以获取每个月的最小日期的记录id month record_id ----- --------- 8 2 7 3 正如我们看到的2012-08-29
id date
-- ----
1 2012-08-30
2 2012-08-29
3 2012-07-25
我需要在PostgreSQL中编写一个SQL查询,以获取每个月的最小日期的记录id
month record_id
----- ---------
8 2
7 3
正如我们看到的2012-08-29<2012-08-30,现在是8个月,所以我们应该显示记录_id=2
我试过这样的东西
SELECT
EXTRACT(MONTH FROM date) as month,
record_id,
MIN(date)
FROM Records
GROUP BY 1,2
但它显示了3条记录
有人能帮忙吗?
如果您有重复的最小日期,这将返回倍数:
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
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;
SQLFiddle
UPD:此查询:
1) 按月份和日期订购记录
2) 每个月挑选第一条记录(由于订购,第一条记录有MIN(日期)
)
这里的细节
SQLFiddle
UPD:此查询:
1) 按月份和日期订购记录
2) 每个月挑选第一条记录(由于订购,第一条记录有MIN(日期)
)
这里的详细信息我认为您需要使用子查询,类似这样:
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
我认为您需要使用子查询,类似这样:
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
嗯。但是你如何选择每个月的最小日期呢?@Kirill Reva修复了这个问题。但是你如何选择每个月的最小日期呢?@Kirill Reva修复了这个问题,这显然是一个好办法。为了清楚起见,我会将子查询放置为CTE(如
和minbymonth作为(…您的查询…)选择。不过,这只是口味的问题+1@Thilo很好的调用,也添加了这个。这显然是要走的路。为了清楚起见,我会将子查询放置为CTE(如,minbymonth为(…您的查询…)选择
。不过,这只是口味的问题+1@Thilo很好的呼叫,也添加了这个。谢谢,这是解决方案。谢谢,这是解决方案。ps.将rank()
更改为row\u number()
如果您希望在给定月份中存在重复的最小日期时得到一个结果。或者将按日期排序asc
更改为按日期排序asc,按记录排序id asc
以在您有重复的最小日期时获得id较低的记录。ps.将rank()
更改为行编号()
如果您希望在给定月份中存在重复的最小日期时获得单个结果。或者将按日期排序asc
更改为按日期排序asc,按记录排序id asc
以在存在重复的最小日期时获得id较低的记录。