2

非常に複雑な製品/可用性の問題が発生しましたが、解決できず、同様の質問はどこにも見つかりませんでした。

表「商品」:

- id
- name

テーブル「期間」:

- id
- start (Date)
- end (Date)
- price (int)
- product_id

私の場合、同じ日付範囲(開始/終了)内であっても、製品を多くの期間に関連付けることができます。

例:商品「A」の場合

期間1)開始:2013-01-01 || 終了:2013-01-07 || 価格:200

期間2)開始:2013-01-07 || 終了:2013-01-14 || 価格:25​​0

期間3)開始:2013-01-07 || 終了:2013-01-10 || 価格:100 ##上記の期間(2)に含まれる

期間4)開始:2013-01-10 || 終了:2013-01-14 || 価格:200 ##上記の期間(2)に含まれる

期間5)開始:2013-01-11 || 終了:2013-01-14 || 価格:150 ##上記の期間(2)に含まれる

私がする必要があるのは、特定の日付範囲のすべての製品とその価格を取得することです。

ユーザーが検索するもの、および取得したいもの:

  • 2013-01-01から2013-01-07までの製品を検索します。製品Aと価格200(期間1)が返されます。

  • 2013-01-02と2013-01-07の間の検索:期間が完全に含まれていないため(2013-01-01日が欠落しているため)、製品Aは返されません。

  • 2013-01-07と2013-01-14の間の検索(最も複雑なケース):「2」の可能な期間((2)と(3 + 4))を持つ製品Aを返す必要があります。ただし、2013-01-10日には「穴」があるため、期間(3 + 5)を返すことはできません。

また、最低価格を取得できるようにしたいと思います。上記の3番目のケースでは、(2)価格が(3 + 4)価格よりも低いため、250を返す必要があります。

どんな助けでも非常に高く評価されるでしょう。

4

1 に答える 1

0

これは解決策ではありませんが、コメントするには長すぎます。

あなたが求めていることは、SQL ではほとんど不可能であり、プログラミング言語では非常に困難です。これを解決するには、2 つの日付間の時間の可能な「タイリング」をすべて見つける必要があります。タイルは個々のレコードであり、タイリングは期間をカバーする一連のレコードです。

問題は、さまざまなサイズのさまざまなソリューションが多数存在することです。

再帰をサポートするプログラミング言語では、動的プログラミング アプローチを採用する場合があります。これは基本的に任意の期間から開始し、再帰的に問題を解決してから、次の期間を検討します (深さ優先アプローチ)。これを SQL で実装するのは簡単ではありません。

おそらく、これをより扱いやすくする問題に追加の制約があります。あるいは、他の誰かが別の方法でそれを理解し、解決策を見つけるかもしれません (それは非常に興味深いでしょう)。ただし、問題をさらに制限できない限り、SQL でこれを行う価値はないというのが私の意見です。

于 2013-03-21T17:54:53.780 に答える