基于列值SQL的选择性筛选行

时间:2017-05-03 03:10:20

标签: sql sql-server sql-server-2012

我有一个带有键列和其他列的表格如下所示。

enter image description here

Keycolumn是col1,col2,col3,col4的组合。 对于给定的键列值,我有不同的Col5值。 如果键列值在Col5上有多个值,那么请考虑除“&O”以外的任何人。如果所有的状态都是' O'然后考虑' O'

在上面的例子中我应该得到4行。每一行来自黄色,绿色,蓝色和橙色

2 个答案:

答案 0 :(得分:1)

在大多数数据库中,您将使用ANSI标准row_number()函数。像这样:

select t.*
from (select t.*,
             row_number() over (partition by keycolumn order by keycolumn) as seqnum
      from t
     ) t 
where seqnum = 1;

答案 1 :(得分:1)

戈登的查询有一个有效的想法,但如果可能的话,它不会遵循关于选择非'O'行的规则。

WITH
CTE
AS
(
    SELECT
        KeyColumn
        ,Col1
        ,Col2
        ,Col3
        ,Col4
        ,Col5
        ,Col6
        ,ROW_NUMBER() OVER (PARTITION BY KeyColumn
            ORDER BY 
                CASE WHEN Col5 = 'O' THEN 1 ELSE 0 END -- put 'O' last
                ,Col5) as rn -- pick first non-O row
                             -- you can choose other column(s) instead of Col5 here
    FROM YourTable
)
SELECT
    KeyColumn
    ,Col1
    ,Col2
    ,Col3
    ,Col4
    ,Col5
    ,Col6
FROM CTE
WHERE rn = 1
;