Sql 选择具有许多不同列的唯一行

Sql 选择具有许多不同列的唯一行,sql,ms-access,Sql,Ms Access,这是我的桌子: Ref Num Status Task Status Task N ----------------------------------------- TB011 RET Null 0 TB012 RET Null 0 TB013 INP Ready 100 TB013 INP Null 0 TB013

这是我的桌子:

Ref Num   Status    Task Status   Task N
-----------------------------------------
TB011       RET       Null        0  
TB012       RET       Null        0  
TB013       INP       Ready       100  
TB013       INP       Null        0  
TB013       INP       Null        0  
TB014       INP       In Process  100  
TB014       INP       Null        0  
TB014       INP       Null        0  
TB015       INP       Completed   100  
TB015       INP       Ready       200  
TB015       INP       Null        0  
TB016       INP       Ready       100  
TB016       INP       In Process  150  
TB016       INP       Null        0  
TB017       INP       Completed   100  
TB017       INP       In Process  150  
TB017       INP       Ready       199  
TB017       INP       Null        0  
我需要获得每个Ref Num的唯一行,其中:

如果Status=RET,则只有一行任务状态始终为空 如果Status=INP,我只需要任务状态未完成的第一行 我已经添加了任务N行,其中有一个数字,可能会有帮助

结果应该是这样的:

Ref Num   Status    Task Status   Task N   
------------------------------------------
TB011       RET       Null        0  
TB012       RET       Null        0  
TB013       INP       Ready       100   
TB014       INP       In Process  100    
TB015       INP       Ready       200  
TB016       INP       Ready       100  
TB017       INP       In Process  150  
!!在Ref Num、Status、Task Status、Task N之后,我有更多的列,它们包含不同的数据,我也需要它们。

我不知道数据库引擎。 但它可能是这样的:

SELECT * (

SELECT `Ref Num`,Status,`Task Status`,`Task N` 
FROM table
WHERE Status = 'RET'

UNION 

SELECT `Ref Num`,Status,`Task Status`,`Task N` 
FROM table
WHERE Status = 'INP' AND
`Task Status` <> 'Completed'
GROUP BY  `Ref Num`,Status
ORDER BY ORDER BY `Ref Num` ASC


) ORDER BY `Ref Num` ASC

了解dbms对于解决方案选择至关重要,请在提出问题时指定dbms。此解决方案将与支持行号的dbms的预期结果相匹配

SELECT
      Ref_Num
    , Status
    , Task_Status
    , Task_N
FROM (
            SELECT
                  Ref_Num
                , Status
                , Task_Status
                , Task_N
                , ROW_NUMBER() OVER (PARTITION BY REF_NUM
                                     ORDER BY task_N ASC) AS RN
            FROM table1
            WHERE status = 'RET'
                  OR (status = 'INP'
                  AND task_status <> 'Completed'
                  AND task_n <> 0)
      ) d
WHERE  rn = 1
ORDER BY
      Ref_Num
;

你在使用什么数据库?请用数据库标记问题。此外,SQL表表示无序集。他们没有第一个概念。您需要一个单独的列来定义排序,通常是一个id或创建日期。请使用“代码”按钮格式化块,不要到处添加。这使得您无法在sql FIDLE中创建示例数据,也无法在此处帮助您对其进行格式化。“如果Status=INP,我只需要任务状态未完成的第一行”按什么排序?哪个列决定什么是第一个,什么是最后一个?任务N在第一个任务中较小,除了0,这意味着一旦我们有了排序数据的方法,就可以确定什么是第一个;但是,根据数据库管理系统的不同,有不同的方法可以做到这一点,Oracle和SQL Server&其他人可以使用ROW_NUMBER,但MySQL不能。请指定您使用的数据库管理系统及其版本;对每个问题都这样做。