【问题标题】:How can I duplicate the result set like below如何复制结果集,如下所示
【发布时间】:2017-11-16 17:31:44
【问题描述】:

我有一个如下表,我想在最小日期小于或等于最大日期时复制记录

686151209   E13232677   1333439 2017-10-23
686151209   E13232677   1333439 2017-10-26

我希望得到如下结果集

686151209   E13232677   1333439 2017-10-23
686151209   E13232677   1333439 2017-10-24
686151209   E13232677   1333439 2017-10-25
86151209    E13232677   1333439 2017-10-26

【问题讨论】:

  • 你有日期表吗?
  • 想要的结果中有错字(缺少 6 个)?
  • 你的表中哪个字段设置了主键或唯一键???
  • 第 1、2 和 3 列一起
  • 你可以称它们为 col1、col2、col3 和coldate

标签: sql sql-server


【解决方案1】:

您并使用 spt_values 获取连续数:

   ;WITH testdata(col1,col2,col3,col4)AS(
      SELECT '686151209','E13232677','1333439','2017-10-23' UNION all
      SELECT '686151209','E13232677','1333439','2017-10-26'
   )
   SELECT col1,col2,col3,DATEADD(d,sv.number-1,a.mindate) AS col4,sv.number FROM (
      SELECT col1,col2,col3,CONVERT(DATE,MIN(col4)) AS mindate,CONVERT(DATE,MAX(col4)) AS maxdate 
      FROM testdata AS t 
     group  by col1,col2,col3
   ) AS a 
   INNER JOIN master.dbo.spt_values AS sv ON sv.type='P' AND sv.number BETWEEN 1 AND DATEDIFF(d,mindate,maxdate)+1
+-----------+------------+---------+------------+-- ------+ | col1 | col2 | col3 | col4 |号码 | +-----------+------------+---------+------------+-- ------+ | 686151209 | E13232677 | 1333439 | 2017-10-23 | 1 | | 686151209 | E13232677 | 1333439 | 2017-10-24 | 2 | | 686151209 | E13232677 | 1333439 | 2017-10-25 | 3 | | 686151209 | E13232677 | 1333439 | 2017-10-26 | 4 | +-----------+------------+---------+------------+-- ------+

【讨论】:

    【解决方案2】:

    一种方法是数字表。如果行数不多,我也喜欢递归 CTE:

    with cte as (
          select col1, col2, col3, mind, maxd
          from (select col1, col2, min(dte) as mind, max(dte) as maxd
                from t
                group by col1, col2, col3
               ) t
          union all
          select col1, col2, col3, dateadd(day, 1, mind), maxd
          from cte
          where  dateadd(day, 1, mind) < maxd
         )
    select col1, col2, col3, mind
    from cte;
    

    每个col1/col2 组合限制为 100 行,除非您设置了最大递归选项。

    【讨论】:

      【解决方案3】:

      或者像这样:

      CREATE TABLE temp
      (
          ID BIGINT,
          CODE VARCHAR(50),
          ID2 BIGINT,
          DATE DATE
      );
      
      INSERT INTO temp VALUES (686151209, 'E13232677', 1333439, '2017-10-23'),
                                (686151209, 'E13232677', 1333439, '2017-10-26');
      
      SELECT generate_series(T.D1::timestamp, T.D2::timestamp, interval '1 day')::date
      FROM
      (
      SELECT A.id, A.code, A.id2,  A.dates AS D1, B.dates  AS D2
      FROM temp A
      LEFT JOIN temp b ON (A.id = B.id AND
                            A.code=B.code AND
                            A.id2 = B.id2 AND
                            B.dates > A.dates)
      WHERE B.id IS NOT NULL
      ) T;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-15
        • 1970-01-01
        • 1970-01-01
        • 2013-10-27
        • 2018-01-19
        • 2020-09-26
        • 2013-05-01
        相关资源
        最近更新 更多