我有一个数据如下表的表,我想在此值可用的-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
答案 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