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不能。请指定您使用的数据库管理系统及其版本;对每个问题都这样做。