【问题标题】:Selective Filter rows based on column Value SQL基于列值 SQL 的选择性过滤行
【发布时间】:2017-05-03 03:10:19
【问题描述】:
我有一个带有 keycolumn 和其他列的表,如下所示。
Keycolumn 是 col1,col2,col3,col4 的组合。
对于给定的键列值,我对 Col5 有不同的值。
如果键列值在 Col5 上有多个值,则考虑除“O”之外的任何值。如果所有状态都是“O”,则考虑“O”。
在上述情况下,我应该得到 4 行。黄色、绿色、蓝色和橙色中的每一行
【问题讨论】:
标签:
sql
sql-server
sql-server-2012
【解决方案1】:
Gordon 的查询有正确的想法,但如果可能,它不符合您关于选择非“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
;
【解决方案2】:
在大多数数据库中,您将使用 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;