每个Ref Number的唯一行在哪里

时间:2014-08-08 10:18:08

标签: sql

这是我的表:

Ref Num     Status  Task Status
TB011       RET     
TB012       RET     
TB013       INP     Ready
TB013       INP     
TB013       INP     
TB014       INP     In Process
TB014       INP     
TB014       INP     
TB015       INP     Completed
TB015       INP     Ready
TB015       INP     
TB016       INP     Ready
TB016       INP     In Process
TB016       INP     
TB017       INP     Completed
TB017       INP     In Process
TB017       INP     Ready
TB017       INP     

我需要获得每个“Ref Num”的唯一行,其中:

  • 如果Status = RET只有一行,Task Status将始终为空
  • 如果Status = INP我只需要Task Status未完成的第一行

结果应该是这样的:

Ref Num     Status  Task Status
TB011       RET     
TB012       RET     
TB013       INP     Ready
TB014       INP     In Process
TB015       INP     Ready
TB016       INP     Ready
TB017       INP     In Process

备注!我在Ref NumStatusTask Status之后有更多列,其中包含不同的数据,我也需要它们。

2 个答案:

答案 0 :(得分:0)

首先,SQL表表示无序集。因此,没有第一个"第一个"在表中的行。需要有另一列指定排序。让我假设你有这样一排。我将其称为id

您所拥有的是优先级问题。大多数数据库都支持ANSI标准row_number()函数。您可以通过巧妙地使用order by中的row_number()子句来执行您想要的操作:

select t.*
from (select t.*,
             row_number() over (partition by RefNum
                                order by (case when status = 'Ret' and taskstatus is null then 1
                                               when status <> 'Ret' and taskstatus <> 'Completed' then id
                                          end)
                                end) as seqnum
      from mytable t
     ) t;

其中seqnum = 1;

答案 1 :(得分:0)

如果你有一个主键,那么你可以使用该in子句再次过滤。

没有主键我尝试如下希望它可以解决您的问题。

SELECT * 来自test WHERE status ='RET' 或status =“INP” 和task_sta&lt;&gt; “已完成” GROUP BY refid 限制0,30;