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

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

新規登録して質問してみよう
ただいま回答率
87.20%
PostgreSQL

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

SQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

受付中

NOT EXISTS中のwhere句をcase when で分岐させると取得に時間がかかりすぎる。

shakesuke
shakesuke

総合スコア0

PostgreSQL

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

SQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

4回答

0評価

1クリップ

38閲覧

投稿2020/02/28 01:00

前提・実現したいこと

以下のテーブルから
・同一レコードからcreate_dateが最新のものだけを取得したい
・同一レコードかどうかの判断は、
house_codeに値が入っていればhouse_codeが同じもの
house_codeがnullか''なら、product_nameが同じもの。

sql

CREATE TABLE tbl_products ( product_id integer NOT NULL, product_name character varying (100), house_code character varying (48), create_date timestamp without time zone DEFAULT now() NOT NULL );

例えばこのようなレコードから
|ID| product_name| house_code| create_date|
|:--|:--:|--:|
1|い|1111|2020-02-18 12:46:37|
2|い| |2020-02-19 12:46:37|
3|は|2222|2020-02-20 12:46:37|
4|は| |2020-02-21 12:46:37|
5|ほ|3333|2020-02-22 12:46:37|
6|へ|3333|2020-02-23 12:46:37|
7|へ| |2020-02-24 12:46:37|

こういった結果のデータを取得したいと思っています。
|ID| product_name| house_code| create_date|
|:--|:--:|--:|
2|い| |2020-02-19 12:46:37|
4|は| |2020-02-21 12:46:37|
6|へ|3333|2020-02-23 12:46:37|
7|へ| |2020-02-24 12:46:37|

そこで現在こちらのsqlを作成したのですが、件数が10000で取得に5分以上かかります。

sql

SELECT * FROM tbl_products AS a WHERE NOT EXISTS ( SELECT 1 FROM tbl_products AS b WHERE (CASE WHEN length(a.house_code) > 0 THEN a.product_name = b.product_name ELSE a.house_code = b.house_code END ) AND a.create_date < b.create_date ); **NOT EXISTS中のwhere句をcase when で分岐させている**のが遅くさせている原因だと思うのですが、他にやり方が分からず立ち止まっている状態です。 何かほかに良いsqlがあれば教えていただけないでしょうか?

試したこと

サブクエリでgroup byを使って取得するsqlで上手くいくのではないかと、現在試行錯誤しています。

補足情報(FW/ツールのバージョンなど)

現在postgresql9.6で開発をしています。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

workaholist
workaholist

2020/02/28 01:10 編集

まずグループ化してそのグループごとに最新日付のレコードを取りたいのだと思いますが、 グループ化する条件をかくにんさせてください。 ①house_codeに値が入っていればhouse_codeが同じもの ②house_codeがnullか''なら、product_nameが同じもの の条件がよくわかりませんでした。 比較元がhouse_codeなし、比較先がhouse_codeあり であればどちらのルールが採用されるのですか?
m.ts10806
m.ts10806

2020/02/28 01:34

実行計画とってみてください。
shakesuke
shakesuke

2020/02/28 01:48 編集

返信ありがとうございます。 >>workaholistさん 比較元を採用します。 >>m\.ts10806さん postgresqlのクエリ実行計画を取ったことがないので、少々お時間をください。 取れたらこちらに書き込みます。 ちなみに現在phpPgAdminで直接こちらのsqlを実行しても5分ほどかかってしまいます。
m.ts10806
m.ts10806

2020/02/28 01:51

Analyze もつけたほうがどこに問題があるか時間かかっているか観れますので、そちらを。
shakesuke
shakesuke

2020/02/28 01:54

>>m\.ts10806さん アドバイスありがとうございます。 やってみます。
yureighost
yureighost

2020/02/28 03:22

取得結果で分かりづらいのが、「い」や「は」は一つだけなのに、 「へ」は二つ取れているところですね。 複数のproduct_nameに跨るhouse_codeの場合はproduct_nameが複数取得されるのは容認するってことでしょうか。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PostgreSQL

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

SQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。