2017-05-04 64 views
1

我面臨的挑戰是我無法用我有限的SQL技能來掌握。我希望你能幫助我。鑑於我有一個表格,其中的項目價格對於指定時間段內的特殊客戶有效。在SQL中查找重疊的價格有效日期

因爲人們在進入一個時間段的新價格之前有時並不認爲,我必須找出哪裏有重疊的產品編號和客戶編號組合的時間段,我只需要找出IF是否存在重疊正在發生,而不是重疊正在發生。

我有這樣的數據表CustomerPrices:

Item No Customer No  Valid from Valid to  Price 
12345  55544   01.01.2016 31.05.2016 5,66 
12345  55544   01.03.2017 01.06.2017 4,55 
12345  55544   01.02.2017 01.07.2017 6,41 

可否請你指出我在正確的方向?

此致敬禮和謝謝!

+1

你的dbms是什麼? –

+0

我正在使用SSMSE! – Kami

回答

0

如果你只需要客戶/項目對有重疊,那麼:

select distinct custno, itemno 
from customerprices cp 
where exists (select 1 
       from customerprices cp2 
       where cp2.custno = cp.custno and cp2.itemno = cp.itemno and 
        cp2.validfrom <= cp.validto and 
        cp2.validto >= cp.validto and 
        (cp2.validfrom <> cp.validfrom or cp2.validto <> cp.validto) 
      ); 

這是什麼邏輯?首先,它假定在時間上沒有完全重複。其次,它檢查是否有任何重疊 - 包括最終的情況。這應該處理任何重疊(ABBA,ABAB)。

+0

這正是我需要的!非常感謝! – Kami

0
select 
    itemno, 
    custno, 
    validfrom, 
    validto, 
    price 
from 
    CustomerPrices a 
where 
    exists (
     select 1 
     from CustomerPrices b 
     where 
      a.itemno = b.itemno 
      and a.custno = b.custno 
      and ((a.validfrom between b.validfrom and b.validto) 
       or (a.validto between b.validfrom and b.validto)) 
    ) 
0

您可以將日期類型的條目轉換爲整數表示形式(請參閱here)。這將使您可以更輕鬆地比較日期條目。

+0

你能解釋一下嗎?任何兼容dbms中的日期比較與整數比較幾乎相同。你使用相同的語法和一切。我覺得顯式轉換數據類型只是在編碼和執行過程中浪費了一些週期。 –

+0

認爲這將比較容易與子查詢進行比較,所提供的EXISTS結果更好。 –

0

不確定,你在找什麼輸出?解釋輸出。

IT返回最後一行,因爲其有效from與前一行validto重疊。

declare @t table(id int identity(1,1),ItemNo int,CustomerNo int 
,Validfrom date,Validto date,Price int) 
insert into @t VALUES 
(12345,55544, '2016-01-01','2016-05-31',566) 
,(12345,55544,'2017-03-01','2017-06-01',455) 
,(12345,55544,'2017-02-01','2017-07-01',641) 
select t1.* 

from @t t 
inner join @t t1 
on t.ItemNo=t1.ItemNo 
and t.CustomerNo=t1.CustomerNo 
where 
(t1.Validfrom<t.Validto) 
and t1.id-t.id=1