2013-02-19 26 views
0

我已經到達日期01/01/2010,這已經發生了50次,並且我希望使用下面的逗留權重指南隨機選擇50個出發日期,因爲您大部分這些會在2天后離開,但我無法弄清楚如何編寫代碼,你能幫忙嗎?加權一段時間以獲得不同的日期每次

LengthofStay LengthofStayWeighting 
------------ --------------------- 
1   1 
2   5 
3   4 
4   3 
5   3 
6   3 
7   3 
8   1 
9   1 
10   1 

我已經開始,但已經得到了已經陷入

SELECT ArrivalDate,RAND(checksum(NEWID())) * LengthOfStay.LengthofStayWeighting AS Expr1, 
ArrivalDate + Expr1 as DepartureDate 

FROM Bookings, LengthOfStay 
ORDER BY ArrivalDate 

回答

0

您可能需要使用DATEADD

SELECT ArrivalDate, DATEADD(day, RAND(checksum(NEWID())) * LengthOfStay.LengthofStayWeighting, ArrivalDate) AS DepartureDate  
FROM Bookings, LengthOfStay 
ORDER BY ArrivalDate 

更新:基於您的評論,我想我誤解了這個問題。這是你需要什麼?:

SELECT ArrivalDate, 
DATEADD(day, (select TOP 1 LengthofStayWeighting FROM LengthOfStay group by LengthofStayWeighting ORDER BY LengthofStayWeighting DESC), ArrivalDate) AS DepartureDate  
    FROM Bookings 
    ORDER BY ArrivalDate 

基本上你需要獲得最重複的長度,在你的情況下「1」。如果是這樣,我認爲你需要包括一個FOREIGN鍵。

SELECT ArrivalDate, 
DATEADD(day, (select TOP 1 LengthofStayWeighting FROM LengthOfStay l WHERE b.Id = l.BookingId GROUP BY LengthofStayWeighting ORDER BY LengthofStayWeighting DESC), ArrivalDate) AS DepartureDate  
    FROM Bookings b 
    ORDER BY ArrivalDate 
+0

嗨卡洛斯 出發日期必須始終在到達日期之後,我該怎麼做呢? – wafw1971 2013-02-19 14:37:07

+0

對不起卡洛斯,它不是你它,我不能清楚地解釋自己在提問有關SQL代碼的問題。 5%的住宿將爲1晚 50%的住宿將爲2晚 30%的住宿將爲3,4,5,6,7晚 10%的住宿將爲8,9, 10,11,12,13,14夜 5%的住宿時間爲15至28晚 我只需要隨機化上述百分比。 我希望這樣做更有意義。 – wafw1971 2013-02-19 15:05:51

0

您正在嘗試從累積分佈中拉出數字。這需要生成一個隨機數,然後從分佈中拉出。

下面的代碼給出了一個例子:

with LengthOfStay as (select 1 as LengthOfStay, 1 as LengthOfStayWeighting union all 
        select 2 as LengthOfStay, 5 union all 
        select 3, 4 union all 
        select 4, 4 
       ), 
    Bookings as (select cast('2013-01-01' as DATETIME) as ArrivalDate), 
    CumeLengthOfStay as 
     (select los.*, 
       (select SUM(LengthOfStayWeighting) from LengthOfStay los2 where los2.LengthOfStay <= los.LengthOfStay 
       ) as cumeweighting 
      from LengthOfStay los 
     ) -- select * from CumeLengthOfStay 
SELECT ArrivalDate, clos.LengthOfStay, randnum % sumweighting, sumweighting, 
     ArrivalDate + clos.LengthOfStay as DepartureDate 
FROM (select b.*, ABS(CAST(NEWID() AS binary(6))+0) as randnum 
     from Bookings b 
    ) b cross join 
    (select SUM(LengthOfStayWeighting) as sumweighting from LengthOfStay) const left outer join 
    CumeLengthOfStay clos 
    on (b.randnum % const.sumweighting) between clos.cumeweighting - clos.LengthOfStayWeighting and clos.cumeweighting - 1 
ORDER BY ArrivalDate 

基本上,你加起來的權重,產生的隨機數小於最高權重(使用%操作者),然後查找在這個值累計權重總和。

+0

嗨戈登,這似乎非常複雜的一個簡單的dateadd查詢。我的意思是卡洛斯的幫助下上面我有這遠: SELECT ArrivalDate,DATEADD(天,RAND(校驗(NEWID())) * LengthOfStay.LengthofStay,ArrivalDate)AS DepartureDate FROM預訂,LengthOfStay 但我需要出發日期是最早的不同日期的第二天。 – wafw1971 2013-02-19 15:34:23

+0

@ wafw1971。 。 。數據庫並非專門爲從分配中提取價值而設計的。他們可以做到這一點。但是這個查詢並不是那麼複雜。它正在做一些從分配中拉出的東西。 – 2013-02-19 15:36:59

+0

嗨戈登 我已經有131萬行數據在我的數據庫中,這包括到達日期,網站和PitchType,下一步是用日期填充出發日期,這是根據停留時間隨機化的例子5%的住宿將用於1晚50%的住宿將用於2晚30%的住宿將用於3,4,5,6,7晚10%的住宿將用於8,9,10,11 ,12,13,14晚5%的住宿時間爲15至28晚。我希望我已經解釋了這個權利。謝謝你的幫助。 – wafw1971 2013-02-19 15:42:35

相關問題