1

假设我有一个具有以下结构的表格:

身份证 | 日期 | 姓名 | 状态 | 属性 A | 属性 B

现在我想从该表中选择所有行 - 但是,如果有两个来自相同数据且具有相同名称的项目 - 其中一个具有状态 CANCEL,那么我只想显示一个没有status=CANCLED. 但是,如果-在给定日期只有一个具有该名称的项目-那么无论状态如何,我都想选择它。

目前我对解决方案视而不见——我唯一能想到的就是将存储过程与临时表和大量 if/else 语句混合在一起。但是 - 我很确定必须有解决这个问题的方法 - 并且可能是在一个相当简单的查询中。

谢谢!

编辑:示例数据

ID          Date       Name        Status     Attribute A Attribute B
----------- ---------- ----------- ---------- ----------- -----------
1           2013-10-17 A           Complete   AA          BB        
2           2013-10-17 A           Cancled    CC          DD        
3           2013-10-18 A           Cancled    DD          EE        
4           2013-10-18 B           Complete   AA          BB        

创建表的脚本(根据某些要求):

CREATE TABLE [dbo].[StackoverflowTest](
  [ID] [int] NOT NULL,
  [Date] [date] NULL,
  [Name] [varchar](50) NULL,
  [Status] [varchar](10) NULL,
  [Attribute A] [nchar](10) NULL,
  [Attribute B] [nchar](10) NULL,
 )

根据上面的数据 - 我想要返回的行是具有以下 ID 的行:1、3、4

希望这能让我的意图更清楚一点

4

2 回答 2

1

您可以为此使用带有 row_number() 函数的公用表表达式

with cte as (
   select
       *,
       row_number() over(
           partition by Date, Name
           order by case when status = 'Cancled' then 1 else 0 end
       ) as rn 
   from Table1
)
select
    ID, Date, Name, Status, [Attribute A], [Attribute B]
from cte
where rn = 1

但是,如果有多个记录具有相同的日期、名称和状态 <> 'CANCELED',则查询将只返回一个任意行。

=> sql 小提琴演示

于 2013-10-17T13:51:20.017 回答
0

这假定其他状态值的 alpha 顺序不低于“已取消”。

select max([date]) as [date], [name], max([Status]), [Attribute A], [Attribute B]
From [YourTableName]
group by [Name],[Attribute A], [Attribute B]
于 2013-10-17T13:52:50.553 回答