1

私はテーブルを持っています、構造を持つ「レコード」としましょう:

id      date
--      ----
1       2012-08-30
2       2012-08-29
3       2012-07-25

毎月のMIN日付のrecord_idを取得するには、PostgreSQLでSQLクエリを作成する必要があります。

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つのレコードを示しています。

誰か助けてもらえますか?

4

5 に答える 5

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

于 2012-11-22T19:58:36.980 に答える
2
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
于 2012-11-22T20:13:00.643 に答える
2

SQLフィドル

select distinct on (date_trunc('month', date))
    date_trunc('month', date) as month,
    id,
    date
from records
order by 1, 3 desc
于 2012-11-22T19:58:11.613 に答える
2

最小日付が重複している場合、これは倍数を返します。

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;

http://sqlfiddle.com/#!1/2a054/3

于 2012-11-22T19:58:19.620 に答える
1

次のようなサブクエリを使用する必要があると思います。

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
于 2012-11-22T20:02:49.533 に答える