在tsql中的特定值之后立即删除值

时间:2018-08-22 07:04:17

标签: sql-server tsql

我有一个数据如下表的表,我想在此值可用的-1e38行之间逐行删除

实际上-1e38值表示-1e38之前的行无效。

请帮助。

 declare @tbl table (id int, ex_date date, value float, final_date date)

 insert into @tbl 
 values(1,'2018-02-10',-1e38,'2018-03-30'),
       (1,'2018-02-28',10,'2018-03-30'),
       (1,'2018-02-28',12,'2018-03-30'),
       (1,'2018-01-29',-1e38,'2018-03-31'),
       (1,'2018-01-29',19,'2018-01-30'),
       (1,'2018-01-29',22,'2018-01-30'),
       (1,'2018-01-29',22,'2018-01-31')

select * 
from @tbl 
order by final_date desc, ex_date desc 

应删除:

  1 2018-01-29  -1E+38  2018-03-31
  1 2018-02-28  10  2018-03-30

不应删除:

  1 2018-02-28  12  2018-03-30  

应删除:

  1 2018-02-10  -1E+38  2018-03-30
  1 2018-01-29  22  2018-01-31

不应删除:

  1 2018-01-29  19  2018-01-30
  1 2018-01-29  22  2018-01-30

1 个答案:

答案 0 :(得分:1)

不确定我是否已掌握您的要求。 选择 5行,不包括在-1e38行之后立即显示的行,具体取决于您为select指定的顺序:

declare @tbl table (id int , ex_date date, value float, final_date date)
insert into @tbl values
(1,'2018-02-10',-1e38,'2018-03-30'),
(1,'2018-02-28',10,'2018-03-30'),
(1,'2018-02-28',12,'2018-03-30'),
(1,'2018-01-29',-1e38,'2018-03-31'),
(1,'2018-01-29',19,'2018-01-30'),
(1,'2018-01-29',22,'2018-01-30'),
(1,'2018-01-29',22,'2018-01-31')

;With Numbered as (
select *,ROW_NUMBER() OVER (order by final_date desc, ex_date desc ) as rn
from @tbl
)
select
    n1.*
from
    Numbered n1
        left join
    Numbered n2
        on
            n1.rn = n2.rn + 1
where
    (n2.id is null or n2.value != -1e38)
    /* and n1.value != -1e38 --? */
order by final_date desc, ex_date desc

结果:

id          ex_date    value                  final_date rn
----------- ---------- ---------------------- ---------- --------------------
1           2018-01-29 -1E+38                 2018-03-31 1
1           2018-02-28 12                     2018-03-30 3
1           2018-02-10 -1E+38                 2018-03-30 4
1           2018-01-29 19                     2018-01-30 6
1           2018-01-29 22                     2018-01-30 7

如果您还想排除包含-1e38的行,请取消注释上面额外的WHERE子句条件。

如果您实际上要删除行,请用select *替换delete n1,删除order by并反转where子句条件:

delete n1
from
    Numbered n1
        left join
    Numbered n2
        on
            n1.rn = n2.rn + 1
where
    n2.value = -1e38
    or n1.value = -1e38