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较低的记录。