我有一张桌子
Val | Number
08 | 1
09 | 1
10 | 1
11 | 3
12 | 0
13 | 1
14 | 1
15 | 1
我需要返回Number = 1的最后一个值(无论多少可能),直到Number更改,但不需要Number = 1的第一个实例。基本上我需要选择返回,直到Number更改为0(15 ,14,13)
在MSSQL中有没有正确的方法呢?
答案 0 :(得分:2)
基于以下内容:
我需要返回Number = 1
的最后一个值基本上我需要选择返回,直到数字变为0(15,14, 13)
尝试( Fiddle demo ):
select val, number
from T
where val > (select max(val)
from T
where number<>1)
编辑以解决所有可能的组合(Fiddle demo 2)
;with cte1 as
(
select 1 id, max(val) maxOne
from T
where number=1
),
cte2 as
(
select 1 id, isnull(max(val),0) maxOther
from T
where val < (select maxOne from cte1) and number<>1
)
select val, number
from T cross join
(select maxOne, maxOther
from cte1 join cte2 on cte1.id = cte2.id
) X
where val>maxOther and val<=maxOne
答案 1 :(得分:1)
DEMO:http://sqlfiddle.com/#!3/e7d54/23
create table T(val int identity(8,1), number int)
insert into T values
(1),(1),(1),(3),(0),(1),(1),(1),(0),(2)
; WITH last_1 AS (
SELECT Max(val) As val
FROM t
WHERE number = 1
)
, last_non_1 AS (
SELECT Coalesce(Max(val), -937) As val
FROM t
WHERE EXISTS (
SELECT val
FROM last_1
WHERE last_1.val > t.val
)
AND number <> 1
)
SELECT t.val
, t.number
FROM t
CROSS
JOIN last_1
CROSS
JOIN last_non_1
WHERE t.val <= last_1.val
AND t.val > last_non_1.val
我知道这有点冗长,但我故意用这种方式来说明方法论。
val
number=1
。val
小于步骤1中找到的数字的所有值,找到val
number<>1
答案 2 :(得分:1)
我认为你可以使用窗口函数,如下所示:
with cte as (
-- generate two row_number to enumerate distinct groups
select
Val, Number,
row_number() over(partition by Number order by Val) as rn1,
row_number() over(order by Val) as rn2
from Table1
), cte2 as (
-- get groups with Number = 1 and last group
select
Val, Number,
rn2 - rn1 as rn1, max(rn2 - rn1) over() as rn2
from cte
where Number = 1
)
select Val, Number
from cte2
where rn1 = rn2
<强> sql fiddle demo 强>
答案 3 :(得分:0)
select val, count (number) from
yourtable
group by val
having count(number) > 1
having子句是此处的关键,为您提供具有多个值1的所有val。