前提・実現したいこと
以下のテーブルから
・同一レコードからcreate_dateが最新のものだけを取得したい
・同一レコードかどうかの判断は、
house_codeに値が入っていればhouse_codeが同じもの
house_codeがnullか''なら、product_nameが同じもの。
sql
1CREATE TABLE tbl_products ( 2 product_id integer NOT NULL, 3 product_name character varying (100), 4 house_code character varying (48), 5 create_date timestamp without time zone DEFAULT now() NOT NULL 6);
例えばこのようなレコードから
|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
1SELECT * 2FROM tbl_products AS a 3WHERE NOT EXISTS ( 4 SELECT 1 5 FROM tbl_products AS b 6 WHERE 7 (CASE 8 WHEN length(a.house_code) > 0 THEN a.product_name = b.product_name 9 ELSE a.house_code = b.house_code 10 END 11 ) 12 AND a.create_date < b.create_date 13); 14 15 16**NOT EXISTS中のwhere句をcase when で分岐させている**のが遅くさせている原因だと思うのですが、他にやり方が分からず立ち止まっている状態です。 17何かほかに良いsqlがあれば教えていただけないでしょうか? 18
試したこと
サブクエリでgroup byを使って取得するsqlで上手くいくのではないかと、現在試行錯誤しています。
補足情報(FW/ツールのバージョンなど)
現在postgresql9.6で開発をしています。