当前位置: 代码迷 >> Sql Server >> 这样的需求SQL语句要怎么写
  详细解决方案

这样的需求SQL语句要怎么写

热度:51   发布时间:2016-04-24 09:10:53.0
求助这样的需求SQL语句要如何写
需求:表1是股票发生大宗交易的股票代码、日期、大宗交易成交价格
      表2是各个股票的历史记录
      现在希望能够得到每个发生大宗交易的股票在这一天之后3天(包括发生当天)之内的价格记录
表1如下:
Code   Date1            Price1
1          2014/3/12   5
2          2014/3/13   2
3          2014/3/13   3

表2如下:
Code   Date2            Price2
1          2014/3/10    4
1          2014/3/11    4.09
1          2014/3/12    4.01
1          2014/3/13    4.05
1          2014/3/14    4.10
1          2014/3/15    4.50
1          2014/3/16    4.45
2          2014/3/10    4
2          2014/3/11    4.09
2          2014/3/12    4.01
2          2014/3/13    4.05
2          2014/3/14    4.10
2          2014/3/15    4.50
2          2014/3/16    4.45
3          2014/3/10    4
3          2014/3/11    4.09
3          2014/3/12    4.01
3          2014/3/13    4.05
3          2014/3/14    4.10
3          2014/3/15    4.50
3          2014/3/16    4.45
3          2014/3/17    4.50
得到的目标结果应该是:
Code   Date1      Price1      Date2          Price2
1          2014/3/12   5           2014/3/12   4.01
1          2014/3/12   5           2014/3/13   4.05
1          2014/3/12   5           2014/3/14   4.10
2          2014/3/13   2           2014/3/13   4.05
2          2014/3/13   2           2014/3/14   4.10
2          2014/3/13   2           2014/3/15   4.50
3          2014/3/13   3           2014/3/13   4.05
3          2014/3/13   3           2014/3/14   4.10
3          2014/3/13   3           2014/3/15   4.50
最基本的连接我会写,但是要怎么限定在大宗交易发生之后3个交易日的记录不知道要怎么去限定。
而且,因为交易存在双休日,是不能通过限定日期的,必须通过判断记录数才行。
求大神指导,跪谢!
------解决思路----------------------
SELECT
a.*,b.Date2,b.Price2
FROM T1 AS a
INNER JOIN T2 AS b ON a.Code=b.Code AND a.Date1<=b.Date2 AND b.Date2<DATEADD(dd,3,a.Date1)

------解决思路----------------------
2005及以上版本试试这个

select *
from (
select ROW_NUMBER() OVER(PARTITION by t2.code ORDER BY t2.date2 ) xh ,
from t1 join t2 on t1.code=t2.code
) t 
 where xh <=3


------解决思路----------------------
/* 测试数据
WITH table1(Code,Date1,Price1) AS (
    SELECT 1,'2014-03-12',5 UNION ALL
    SELECT 2,'2014-03-13',2 UNION ALL
    SELECT 3,'2014-03-13',3
)
,table2(Code,Date2,Price2) AS (
    SELECT 1,'2014-03-10',4.00 UNION ALL
    SELECT 1,'2014-03-11',4.09 UNION ALL
    SELECT 1,'2014-03-12',4.01 UNION ALL
    SELECT 1,'2014-03-13',4.05 UNION ALL
    SELECT 1,'2014-03-14',4.10 UNION ALL
    SELECT 1,'2014-03-15',4.50 UNION ALL
    SELECT 1,'2014-03-16',4.45 UNION ALL
    SELECT 2,'2014-03-10',4.00 UNION ALL
    SELECT 2,'2014-03-11',4.09 UNION ALL
    SELECT 2,'2014-03-12',4.01 UNION ALL
    SELECT 2,'2014-03-13',4.05 UNION ALL
    SELECT 2,'2014-03-14',4.10 UNION ALL
    SELECT 2,'2014-03-15',4.50 UNION ALL
    SELECT 2,'2014-03-16',4.45 UNION ALL
    SELECT 3,'2014-03-10',4.00 UNION ALL
    SELECT 3,'2014-03-11',4.09 UNION ALL
    SELECT 3,'2014-03-12',4.01 UNION ALL
    SELECT 3,'2014-03-13',4.05 UNION ALL
--  模拟双休不交易的情况
--  SELECT 3,'2014-03-14',4.10 UNION ALL
--  SELECT 3,'2014-03-15',4.50 UNION ALL
    SELECT 3,'2014-03-16',4.45 UNION ALL
    SELECT 3,'2014-03-17',4.50
)*/
        SELECT t1.Code, t1.Date1, t1.Price1,
               t2.Date2, t2.Price2
          FROM table1 t1
   CROSS APPLY (
                    SELECT TOP 3 *
                      FROM table2
                     WHERE Code = t1.Code
                       AND Date2 >= t1.Date1
                  ORDER BY Date2
               ) t2

       Code Date1           Price1 Date2                                       Price2
----------- ---------- ----------- ---------- ---------------------------------------
          1 2014-03-12           5 2014-03-12                                    4.01
          1 2014-03-12           5 2014-03-13                                    4.05
          1 2014-03-12           5 2014-03-14                                    4.10
          2 2014-03-13           2 2014-03-13                                    4.05
          2 2014-03-13           2 2014-03-14                                    4.10
          2 2014-03-13           2 2014-03-15                                    4.50
          3 2014-03-13           3 2014-03-13                                    4.05
          3 2014-03-13           3 2014-03-16                                    4.45
          3 2014-03-13           3 2014-03-17                                    4.50

------解决思路----------------------
该回复于2015-04-22 13:42:59被管理员删除
  相关解决方案