質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
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

解決済

2回答

3061閲覧

【SQL】WHERE句で抽出ごとの最新データの取得について

pn47

総合スコア10

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クリップ

投稿2020/02/29 21:30

編集2020/03/01 02:44

いつもお世話になっております。

以下のような表からそれぞれのKEY_IDごとにその日の最新のVALUE値を取得する方法を模索しております。

【テーブル構成】

create table sample_log ( key_id integer not null, time timestamp(6) with time zone not null, value numeric, primary key (mid,sampled_at) ); INSERT INTO sample_log VALUES(1,'2020/3/1 10:01:12',24)); INSERT INTO sample_log VALUES(1,'2020/3/1 10:01:13',25)); INSERT INTO sample_log VALUES(1,'2020/3/1 10:01:14',26)); INSERT INTO sample_log VALUES(2,'2020/3/1 10:01:12',24)); INSERT INTO sample_log VALUES(2,'2020/3/1 10:01:13',25)); INSERT INTO sample_log VALUES(2,'2020/3/1 10:01:14',26)); INSERT INTO sample_log VALUES(3,'2020/3/1 10:01:12',24)); INSERT INTO sample_log VALUES(3,'2020/3/1 10:01:13',25)); INSERT INTO sample_log VALUES(3,'2020/3/1 10:01:14',26));

【期待結果】

key_idtimevalue
12020/3/1 10:01:1426
22020/3/1 10:01:1426
32020/3/1 10:01:1426

【試したSQL】

SELECT * FROM sample_log WHERE key_id IN(1,2,3) ORDER BY time '2020/03/01 00:00:00' AND '2020/03/1 23:59:59' DESC LIMIT 1

上記のSQLではIN句の中から最新のデータを取るという意味合いになってしまい
1レコードしか取得できませんでした。

実現したいのは期待結果のようなそれぞれのkey_idごとにその日の最新値を取得する方法です。
至らない点も多いかと思いますが、ご教授いただけますでしょうか。

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

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

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

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

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

Orlofsky

2020/02/29 23:42

質問のテーブル定義はCREATE TABLEで、テーブルに存在するデータのINSERTに修正した方が適切なコメントが付き易いです。
Orlofsky

2020/02/29 23:43

[PL/SQL]はOracle Database 専用ですから、削っては?
Zuishin

2020/03/01 00:56

前回の質問は二年間放置し、今日になってベストアンサーを決めました。ベストアンサーは問題のある回答で、これで解決したとは思えません。この質問をする事になって、読み返しもせず決めたものと思われます。
Zuishin

2020/03/01 00:58

失礼、前回ではなくこの質問者の最初の質問の話でした。つまり全部未解決で放置していたようです。
pn47

2020/03/01 02:46

>>Orlofsky様 ご指摘ありがとうございます。 上記2点を対応いたしました、また、過去ログのリンクありがとうございます。 なんとか命令の意味を調べて解決できそうな気がします。
pn47

2020/03/01 02:52

>>Zuishin様 質問をするためにつけたのではなく、2年ぶりにログインした所 画面右上の通知を見て該当の質問、2件にベストアンサーをつけていなかったことの気づき 慌ててベストアンサーをつけました。以後、気をつけます。
guest

回答2

0

ベストアンサー

in を使った参考SQLです。JOINした方が早いですが。

sql

1select * from sample_log 2where (key_id,time) in ( 3 select key_id, max(time) from sample_log group by key_id 4);

投稿2020/03/01 02:05

amura

総合スコア333

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

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

pn47

2020/03/01 02:55

回答ありがとうございます。 WHERE句のin内でselectできるんですね…。 SQLで絞り込めることを確認しましたが、group_by等を使ったことがないので 自分なりに勉強して理解してから使ってみようと思います。
amura

2020/03/01 03:05

INも昔に比べて早くはなりましたが、まだin()内の件数が大量の場合は、JOIN方式をお使いください。
guest

0

似たような過去ログ を参考にされては?

投稿2020/02/29 23:43

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問