0

私はこのようなデータベース構造を持っています

rowid   deltaValue  Applicable
1        r            n/d
1        w            n/d
1        m            n/d
2        r            n/d
2        w            n/d
2        m            n/d
3        r            n/d
3        w            n/r
3        m            n/d

基本的に、「rowid」の最後のグループ、つまりrowid=3. これは、以下の組み合わせを持つ唯一のグループだからです。n/d, n/r

組み合わせを調べてグループ (つまり、ROWID) を取得するだけの tsql クエリはありますか。これが私がこれまでに持っているものです:

select  *
from table
where 1=1
and deltaValue in ('r','w','m')
and ((   1=(case when [DeltaValue] = 'r' and [Applicable]='n/r' then 1 else 0 end)
     and 1=(case when [DeltaValue] = 'w' and [Applicable]='n/d' then 1 else 0 end)
     and 1=(case when [DeltaValue] = 'm' and [Applicable]='n/d' then 1 else 0 end)
     ) OR
     (   1=(case when [DeltaValue] = 'r' and [Applicable]='n/d' then 1 else 0 end)
     and 1=(case when [DeltaValue] = 'w' and [Applicable]='n/r' then 1 else 0 end)
     and 1=(case when [DeltaValue] = 'm' and [Applicable]='n/d' then 1 else 0 end)
     ) OR
     (   1=(case when [DeltaValue] = 'r' and [Applicable]='n/d' then 1 else 0 end)
     and 1=(case when [DeltaValue] = 'w' and [Applicable]='n/d' then 1 else 0 end)
     and 1=(case when [DeltaValue] = 'm' and [Applicable]='n/r' then 1 else 0 end)
     )
    )

出力:

3        r            n/d
3        w            n/r
3        m            n/d
4

3 に答える 3

1

これを試して:

with temp as
(
    SELECT t.rowid
    FROM myTable t
    GROUP BY t.rowid
    HAVING COUNT(CASE WHEN Applicable= 'n/d' THEN 1 END) > 0
       AND COUNT(CASE WHEN Applicable= 'n/r' THEN 1 END) > 0;
)
select * from MyTable as mt
INNER JOIN temp as t
ON mt.RowId = t.RowId
于 2012-08-27T16:07:29.713 に答える
0

以下は、 @Abe Miessler の提案に関する開発と見なすことができます。

WITH counted AS (
  SELECT
    *,
    [n/d count] = COUNT(CASE DeltaValue WHEN 'n/d' THEN 1 END) OVER (PARTITION BY rowid),
    [n/r count] = COUNT(CASE DeltaValue WHEN 'n/r' THEN 1 END) OVER (PARTITION BY rowid)
  FROM atable
)
SELECT
  rowid,
  DeltaValue,
  Applicable
FROM counted
WHERE [n/d count] > 0 AND [n/r count] > 0
;

ご覧のとおり、集計関数のウィンドウバージョンを使用することで結合を回避できます。COUNT()

ところで、クエリをより普遍的にする必要があり、複数のdistinct を持つグループを返すようにする必要DeltaValueがある場合は、少し異なるアプローチを使用できます。

WITH counted AS (
  SELECT
    *,
    MinDeltaValue = MIN(DeltaValue) OVER (PARTITION BY rowid),
    MaxDeltaValue = MAX(DeltaValue) OVER (PARTITION BY rowid)
  FROM atable
)
SELECT
  rowid,
  DeltaValue,
  Applicable
FROM counted
WHERE MinDeltaValue <> MaxDeltaValue
;

上記のクエリは、ウィンドウ処理MAX()を使用MIN()して、(の) グループごとの最小値と最大値を検索し、最小値が最大値rowidと異なるグループを返します。

于 2012-08-28T20:47:00.943 に答える
0

これをお試し下さい

SELECT      *
FROM        Table1
WHERE       rowid IN ( SELECT rowid
                       FROM   ( SELECT * , DENSE_RANK () OVER (PARTITION BY rowid ORDER     BY Applicable) AS myRank FROM Table1
                              ) AS t
                       WHERE  t.myRank > 1 )
于 2012-08-27T16:16:04.297 に答える