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

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

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

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

560閲覧

適用開始日を過ぎた中で一番新しく適用になったものを抜き出すRelation

winterboum

総合スコア23567

SQL

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/06/22 12:22

id item_id customer_id apply_date unit_price 1 1 1 2019-9-1 200 2 1 1 2020-9-1 50 3 2 1 2019-9-1 150 4 2 1 2020-9-1 50

というデータから、id 2,4 を取り出すには valid0 でできますが、これですと未だ適用になっていないデータを取り出してしまいます。
valid1を試した所一つもhitしませんでした。(そりゃそうだ)
valid2,valid3では 1,2,3,4全てが取り出されてしまいました。
1,3を抜き出すSQL、できればActiveRecord_Relationは可能でしょうか

scope :valid0 , ->(date=Date.today){ where("not exists (select 1 from prices as p2 where p2.customer_id = prices.customer_id and p2.item_id = prices.item_id and p2.apply_date > prices.apply_date)") } scope :valid1 , ->(date=Date.today){ where("not exists (select 1 from prices as p2 where p2.customer_id = prices.customer_id and p2.item_id = prices.item_id and p2.apply_date > prices.apply_date)").where("p2.apply_date <= ?",date) } scope :valid2 , ->(date=Date.today){ where("not exists (select 1 from prices as p2 where p2.customer_id = prices.customer_id and p2.item_id = prices.item_id and p2.apply_date > prices.apply_date ane p2.apply_date <= ?)",date)} } scope :valid3 , ->(date=Date.today){ where("not exists (select 1 from prices as p2 where p2.customer_id = prices.customer_id and p2.item_id = prices.item_id and p2.apply_date > prices.apply_date ane prices.apply_date <= ?)",date)} }

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

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

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

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

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

guest

回答1

0

自己解決

not exist の条件に 
and p2.apply_date <= ? or prices.apply_date > ?
を加えて

scope :valid0 , ->(date=Date.today){ where("not exists (select 1 from prices as p2 where p2.customer_id = prices.customer_id and p2.item_id = prices.item_id and p2.apply_date > prices.apply_date and p2.apply_date <= ? or prices.apply_date > ?)",date,date) }

かなぁ。一応動いている模様。
ですが、なんとも読みにくい。もっとスマートな方法ってないでしょうか

否定形の条件式ってどうも論理を取り違える。

投稿2020/06/22 14:25

winterboum

総合スコア23567

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問