2

テーブルには PriceValidFrom 、 PriceValidTo 、 BookingWindowFrom 、 BookingWindowTo の日付フィールドと価格通貨フィールドがあります。クライアントは行をランダムに挿入または更新します。たとえば、PriceValid の期間が他の行よりも短い行もありますが、同じ月内 (価格が異なる) である可能性があります。他の行は同一の PriceValid 期間を持つ場合がありますが、BookingWindow 期間のみが異なる場合があります。テーブルは決して掃除されず、すべてが受け入れられます。日付を指定すると、PriceValidFrom の日付が最も高い行から価格を返すクエリが必要です。以下の例では、テーブルとクエリ ステートメントを考慮します。

PriceValidFrom PriceValidTo Price
05/01/2013     05/30/2013   $100.00
05/15/2013     05/20/2013   $50.00

疑似SQL

select top 1 price
where :Date between PriceValidFrom and PriceValidTo   
order by PriceValidFrom DESC, Price

日付が 2013 年 5 月 16 日の場合、クエリは予想どおり $50.00 を返します。

ここで、ユーザーは、最高の BookingWindowFrom も取得する必要がある予約ウィンドウ期間を追加する必要があります。

PriceValidFrom PriceValidTo Price     BookingWindowFrom  BookingWindowTo
05/01/2013     05/30/2013   $100.00   4/1/2013           5/30/2013 
05/15/2013     05/20/2013   $50.00    4/1/2013           5/30/2013
05/15/2013     05/20/2013   $75.00    5/1/2013           5/30/2013

ここで、日付が 2013 年 5 月 16 日で、予約日が 2013 年 5 月 1 日の場合、クエリは $75.00 を返す必要があります。

期待される結果を達成する方法は?これは単純化された例ですが、実際のテーブルには何百もの行があることに注意してください。

select top 1 price 
where :Date between PriceValidFrom and PriceValidTo    
    and  :BookingDate  between BookingWindowFrom  and  BookingWindowTo
4

2 に答える 2

1

これは、 EffectiveDateの使用方法に基づいた推測です。

select top 1 price
where :pDate between coalesce(EffectiveDate, ValidFrom) and ValidTo
order by coalesce(EffectiveDate, ValidFrom) DESC, Price

それとも、EffectiveDate が利用可能な場合、すべての ValidXXX 日付を単純に破棄しますか?

私は通常、注文句で非 ANSI を巧みに操作するのではなく、最小/最大またはランキング関数を使用して価格を取得することをtopお勧めしますが、それは単なる意見です。

EffectiveDateValidFrom/To の日付を適切にクリーンアップできないようにするために、これは一見少しハックに見えることを認めなければなりません。 " ReallyEffectiveDateそのため、EffectiveDates の数が多くなりすぎて、列を追加する必要があるように見えるのを止めているのは何ですか? 「有効」と「効果的」という言葉は、ここでは同義語のように思われ、理解したりプログラムを作成したりするのが非常に混乱する可能性があります。さて、仮定に満ちた暴言は終わりました。

于 2013-05-01T15:01:56.663 に答える
1

これORDER BYは解決策ではありませんWHERE。条項を変更する必要があります。例えば:

SELECT top 1 price     
WHERE EffectiveDate = :pDate
   OR (EffectiveDate IS NULL AND :pDate BETWEEN ValidFrom AND ValidTo)

ORDER BY EffectiveDate DESC, ValidFrom DESC, Price

ここであなたのスキーマについていくつかのことを想定していますが、これはあなたが始めるのに役立つと思います.

于 2013-05-01T14:58:49.160 に答える