🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

588閲覧

ある期間における最新レコードの取得

KojiroYamamoto

総合スコア21

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/12/02 00:51

編集2019/12/02 02:03

SQLで、ある期間内の最新レコードを取得したいです。
例えば、2015~2019年までに、個人が複数レコード記録されているデータから、
2018年で絞った最新レコードをidごとに取得するイメージです。
WHEREの中にサブクエリとして、BETWEENで2018年の最新レコードを取得し、
INを使って書いてみたのですが、うまく動かないようで、、

例えば、以下のようにデータセットであれば、

<table> |date |id | x1| x2| |:----------|:---|--:|--:| |2018-04-19 |A84 | 91| 1| |2019-12-26 |A84 | 92| 1| |2018-08-23 |A84 | 70| 0| |2016-10-27 |A23 | 50| 1| |2017-01-12 |A27 | 92| 1| |2019-05-02 |A14 | 59| 1| |2016-07-21 |A69 | 87| 0| |2018-04-07 |A14 | 54| 1| |2018-07-21 |A14 | 59| 0| |2016-05-19 |A20 | 70| 0| <table> |date |id | x1| x2| |:----------|:---|--:|--:| |2018-08-23 |A84 | 70| 0| |2018-07-21 |A14 | 59| 0|

という結果を取得したいです。

sql

1SELECT 2 * 3FROM 4 table AS t1 5WHERE 6 t1.date IN ( 7 SELECT 8 MAX(t2.date) 9 FROM 10 table AS t2 11 WHERE 12 t2.date BETWEEN '2018-01-01' AND '2018-12-31' 13 GROUP BY 14 t2.id 15 )

使っているのは、postgresqlです。
宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/12/02 00:53

「うまく動かない」とはどうなっているのでしょう。 あと、下記のような但し書きは不要と思います。そのための初心者アイコンなので。 >初心者質問で申し訳ありませんが、宜しくお願い致します。
NEO_PLANETT-777

2019/12/02 01:03

whereのところ、d1って書いてますが、t1ですよね?
KojiroYamamoto

2019/12/02 01:56 編集

>m.ts10806様 助長な表現、失礼いたしました。 うまく動かないとは、エラーとなりクエリが実行できない、という意味です。 >NEO_PLANETT-777様 申し訳ありません。おしゃる通りt1です。修正致しました。
m.ts10806

2019/12/02 01:59

質問は編集できるので適宜ご対応ください。 それにエラーはそのまま提示してください(「質問するときのヒント」参照)
guest

回答1

0

ベストアンサー

サブクエリのidで全体を検索するのでしょうか?
具体的な期待する結果がないので検証ができませんが

SQL

1SELECT 2 * 3FROM 4 table AS t1 5WHERE 6 (id,d1.date) IN ( 7 SELECT 8 id,MAX(t2.date) 9 FROM 10 table AS t2 11 WHERE 12 t2.date BETWEEN '2018-01-01' AND '2018-12-31' 13 GROUP BY 14 t2.id 15 )

投稿2019/12/02 00:59

編集2019/12/02 01:37
yambejp

総合スコア116661

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2019/12/02 01:36

最初のSELECTの位置が.
yambejp

2019/12/02 01:37

Orlofskyさん ぱっと見、気がつきませんでした。失礼しました。
KojiroYamamoto

2019/12/02 02:02

ありがとうございます。 期待することとしましては、idごとに2018年の最新レコードをもってくることです。 投稿内容を修正いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問