1

私はテーブルを持っています

Val | Number 
08    | 1 
09    | 1 
10    | 1 
11    | 3 
12    | 0 
13    | 1 
14    | 1 
15    | 1 

Number が変更されるまで、Number = 1 の最後の値 (いくつであっても) を返す必要がありますが、Number = 1 の最初のインスタンスは必要ありません。基本的に、Number が 0 (15、14、 13)

MSSQLでこれを行う適切な方法はありますか?

4

5 に答える 5

2

以下に基づく:

Number = 1 の最後の値を返す必要があります

基本的に、Number が 0 (15、14、13) に変わるまで選択を戻す必要があります。

試してください(フィドルデモ):

select val, number 
from T 
where val > (select max(val)
              from T
              where number<>1)

EDIT:可能なすべての組み合わせに対処する(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
于 2013-10-14T16:00:34.297 に答える
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

于 2013-10-14T17:18:55.597 に答える
1

デモ: http://sqlfiddle.com/#!3/e7d54/23

DDL

create table T(val int identity(8,1), number int)

insert into T values
(1),(1),(1),(3),(0),(1),(1),(1),(0),(2)

DML

; 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

少し冗長であることは承知していますが、方法論を説明するために意図的にそのようにしています。

  1. 最高のval場所を見つけますnumber=1
  2. valがステップ 1 で見つかった数よりも小さいすべての値について、最大値を見つけますvalnumber<>1
  3. 最後に、ステップ 1 と 2 で明らかにした値の範囲内にある行を見つけます。
于 2013-10-14T16:20:29.033 に答える
0
select val, count (number) from
yourtable
group by val
having count(number) > 1

ここでキーとなるのは having 節で、1 の値が複数あるすべての val を提供します。

于 2013-10-14T15:52:36.793 に答える