2013-02-19 82 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