
お世話になります。
現在、最新レコードを抽出し外部結合するSQLを考えているのですが、実現できておりません。
実現できるSQLをご存知の方、いらっしゃいましたら情報を頂けますでしょうか。
# 私の使用しているのは、PostgreSQL8.3となります。
実現したい内容は、以下となります。
1.テーブルAから「名前」でグループ化して最新の「更新日付」のレコードを抽出。
2.1の結果とテーブルBを「名前」で結合。
3.テーブルAの「名前」、「点数」、「更新日付」とテーブルBの「判定」を抽出。
⇒ただしテーブルAに情報がある場合は、テーブルBの判定結果を「0」にして出力。
テーブルA テーブルB
---------------------------- -----------------------
名前| 点数| 更新日付 名前 | 判定
---------------------------- -----------------------
AAA 98 2011/4/1 AAA 0
AAA 60 2011/4/3 BBB 1
BBB 70 2011/4/2 CCC 1
BBB 35 2011/4/4 DDD 1
DDD 98 2011/4/1 EEE 0
EEE 47 2011/4/5 FFF 0
GGG 80 2011/4/6 GGG 1
【出力結果】
---------------------------------------------
名前 | 点数 | 更新日付 | 判定
---------------------------------------------
AAA 60 2011/4/3 0
BBB 35 2011/4/4 0(1⇒0に変更)
CCC NULL NULL 1
DDD 98 2011/4/1 0(1⇒0に変更)
EEE 47 2011/4/5 0
FFF NULL NULL 0
GGG 80 2011/4/6 0(1⇒0に変更)
お手数お掛け致しますが、ご教示のほどよろしくお願い致します。
No.1ベストアンサー
- 回答日時:
PostgreSQL 8.3 ですと、「最新の「更新日付」のレコードを抽出」の箇所でセルフジョインが必要になります。
具体的なSQLはこのような感じです。最新の日付を max() で計算しているので、更新日付のデータ型を date にするか、文字列の場合はゼロ埋め ("2011/04/03") しておいてください。
CREATE TABLE テーブルA (名前 text, 点数 integer, 更新日付 date);
INSERT INTO テーブルA VALUES
('AAA', 98, '2011/4/1'),
('AAA', 60, '2011/4/3'),
('BBB', 70, '2011/4/2'),
('BBB', 35, '2011/4/4'),
('DDD', 98, '2011/4/1'),
('EEE', 47, '2011/4/5'),
('GGG', 80, '2011/4/6');
CREATE TABLE テーブルB (名前 text, 判定 integer);
INSERT INTO テーブルB VALUES
('AAA', 0),
('BBB', 1),
('CCC', 1),
('BBB', 1),
('DDD', 0),
('EEE', 0),
('GGG', 1);
SELECT
名前, 点数, 更新日付,
CASE WHEN max_a.名前 IS NOT NULL THEN 0 ELSE 判定 END AS 判定
FROM
(SELECT 名前, max(更新日付) AS 更新日付 FROM テーブルA GROUP BY 名前) AS max_a
JOIN
テーブルA USING (名前, 更新日付)
RIGHT JOIN テーブルB USING (名前);
お礼が遅くなり申し訳ありません。
ご回答ありがとうございます。
頂いたSQLで実現できました。また、更新日付のデータ型についても了解致しました。
ご協力ありがとうございました。
No.2
- 回答日時:
最新レコードを抽出するのにnot existsを使う方法もありますね。
そこの部分以外はgacky-79さんのSQLをそのまま使わせていただきました。
SELECT
名前, 点数, 更新日付,
CASE WHEN max_a.名前 IS NOT NULL THEN 0 ELSE 判定 END AS 判定
FROM
(SELECT * FROM テーブルA AS A1
WHERE NOT EXISTS(
SELECT * FROM テーブルA AS A2
WHERE A1.名前 = A2.名前 AND A1.更新日付 < A2.更新日付
)) AS テーブルA
RIGHT JOIN テーブルB USING (名前);
お礼が遅くなり申し訳ありません。
ご回答ありがとうございます。
not existsを使用しても実現可能なんですね。性能面も考えて
NO.1の方のとどちらを使用するか検討させて頂きます。
ご協力ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- その他(Microsoft Office) パワークエリの複数ファイルのデータ統合について 3 2022/07/14 17:06
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLでUPSERTを一度に複数行やる...
-
テーブルに存在しない列をselec...
-
SELECT 文の NULL列は?
-
単純なselectが遅くなるのです...
-
javaでデータベース上のテーブ...
-
PostgreSQLの断片化の状況を確...
-
reindex と update のデッドロック
-
VIEWのCOPYってできないんですか?
-
PostgreSQL 8.0.2 の ERROR: r...
-
SQLにて指定日付より前、かつ最...
-
テーブル定義書作成時のIndex付...
-
PostgreSQL8.4 配列型 集計
-
Postgresのデータ領域の拡張に...
-
COPYコマンドによるTEXT取り込...
-
PostgreSQL8.3系のAutovacuum不...
-
MS Access から PostgreSQL へ...
-
Postgresqlのレポート機能について
-
SQL 複数テーブルのupdate
-
Accessでデータシートに同じデ...
-
MS Accessの列と行の入れ替えを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT 文の NULL列は?
-
テーブルに存在しない列をselec...
-
SQLでUPSERTを一度に複数行やる...
-
SQLにて指定日付より前、かつ最...
-
単純なselectが遅くなるのです...
-
PostgreSQLの断片化の状況を確...
-
2つのテーブルで引き算 postgres
-
MS Access から PostgreSQL へ...
-
最新レコードを抽出し外部結合...
-
javaでデータベース上のテーブ...
-
Postgresqlのレポート機能について
-
デットロック回避策(autocommit...
-
PostgreSQL レコードからアイテ...
-
Postgresのデータ領域の拡張に...
-
重複を許すキーの構文がわかり...
-
PostgreSQLのリンクテーブル?...
-
異なるデータベースでのINSERT...
-
テーブルを作ろうとしたら。
-
同一カラムに複数条件指定
-
テーブルにcsvファイルをインポ...
おすすめ情報