2012-08-27 36 views
0

我有这样获取列值的组合,TSQL

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

的组合的组合,是否有一个tsql查询将只查看组合并拉取组(即rowid)。 这是我到目前为止有:

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 
+0

你能告诉我们你想要的输出吗? –

+0

我已经添加了输出 – masfenix

回答

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 
+0

rowid ='n/d'<---这没有意义 – ClearLogic

+0

真棒谢谢,按预期工作。 – masfenix

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) 
0

下可能被认为是一种发展NT上@Abe Miessler's建议:

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 
; 

正如你所看到的,你可以通过避免使用windowing版本COUNT()聚集功能的加入。

顺便说一句,如果你需要使查询更加普遍,并且使得返回具有多个不同的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),并返回最小值不同于最大值的那些组。