iT邦幫忙

1

[SQL] 問題請益

  • 分享至 

  • xImage

大家好 我目前有兩張表 Table1 , Table2

期望結果是把 Table1Table2 價格組成一列
依照Table1 最接近 Table2 日期 (不等於且小於)

關連的條件是 以table1為主 找table2.Price
日期最接近(table2.date只能小於table1.date)

我使用 T-SQL,MSSQL

語法如下:

CREATE TABLE #Table1
(	
	buy_date DATETIME,
	Price	INT
);

CREATE TABLE #Table2
(
	buy_date DATETIME,
	Price	INT
)

INSERT INTO #Table1 VALUES
('2018/02/01',150),
('2018/02/02',111),
('2018/02/05',200),
('2018/02/06',15),
('2018/02/07',60);

INSERT INTO #Table2 VALUES
('2018/01/31',313),
('2018/02/01',15),
('2018/02/03',20),
('2018/02/04',111),
('2018/02/06',48);


--期望輸出
SELECT '2018/02/01' , 150 , 313
UNION 
SELECT '2018/02/02' , 111 , 15
UNION 
SELECT '2018/02/05' , 200 , 20
UNION 
SELECT '2018/02/06' , 15 , 111
UNION 
SELECT '2018/02/07' , 60 , 48

SQLFiddle連結

以上面資料為例子:
Table1.date = '2018/02/01' 離他最近的一筆 Table2 資料是 '2018/01/31'
而另一筆 Table1.date = '2018/02/06' 離他最近的一筆 Table2 資料是 '2018/02/04'

會得出

 Table1.date=======Table1.Price=========Table2.Price
 '2018/02/01'        150                    313 
 '2018/02/06'        15                     111 

我有嘗試排序在使用Join但是不能解決我的問題

謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

7
石頭
iT邦高手 1 級 ‧ 2018-02-13 14:57:17
最佳解答

如果是T-SQL 可以使用 CROSS APPLYTable2 最靠近Table1時間 結果集塞選出來

SELECT T1.*,T2.Price
FROM Table1 AS T1
CROSS APPLY
(
   SELECT TOP 1 Price 
   FROM Table2 
   WHERE T1.buy_date > buy_date
   ORDER BY buy_date DESC
) AS T2

連結

謝謝大大 這就是我要的^^

kinyo7462 iT邦新手 5 級 ‧ 2019-10-19 11:19:03 檢舉

!!!!

1
gn00044255
iT邦新手 5 級 ‧ 2018-02-13 11:49:52

"最接近的日期"本身的邏輯就很怪,比如"2018/02/05"最接近的日期不就是"2018/02/04"怎麼會是"2018/02/03",整個邏輯不通,如果只是順序串一起,先做RANK在JOIN即可

看更多先前的回應...收起先前的回應...

我想把table1 和 table2關連起來 但是關連的條件是
以table1為主 找table2.Price 日期最接近(table2.date只能小於table1.date)
我可能那部分打不清楚 已經修改問題了

雖然你做了解釋,我還是不太明白,你的意思是要把table1的第一列跟table2的第一列串一起麼

您好 我有對於 串在一起 定義說明

SELECT t1.buy_date,t1.Price,t2.Price
from (select RANK() OVER (ORDER BY buy_date ASC) SN,* FROM #Table1) t1
left join (select RANK() OVER (ORDER BY buy_date ASC) SN,* FROM #Table2) t2
on t1.sn=t2.sn
where t1.buy_date > t2.buy_date
試試

untitled iT邦新手 5 級 ‧ 2018-02-14 09:05:02 檢舉

這應該需要兩個條件吧,不單只是一個日期條件,感覺有點不太通

我知道沒有最近日期的指令,因為樓主下的結果,已經忽略最接近的日期,只是一個對應;如果是最近日期dog830228的答案才正確

gn00044255 謝謝您的回答
http://sqlfiddle.com/#!18/76ca2/1 Table2 資料筆數較少的話
結果資料就會少

恩恩,所以dog830228的答案才正確,我誤解你的意思了/images/emoticon/emoticon01.gif

另外提供一個寫法
SELECT T1.*,(SELECT TOP 1 Price
FROM Table2
WHERE T1.buy_date > buy_date
ORDER BY buy_date DESC)
FROM Table1 AS T1
跟dog830228差不多意思

我要發表回答

立即登入回答