如何查找具有 8 但仍不具有 9 的列状态值
How to find values of column status that have 8 but still do not have 9
我正在做项目,我需要在 table 中找到一个名为 status 的列(这个列的值是 1-12),我想找到低于条件的所有值(如果 status有 8 个,但仍然没有 9 个),了解更多信息:
原文table:
File_name id status Execution_number
Live_package1.zip 333 3 4444443434343
Live_package2.zip 444 7 8888888886767
Live_package1.zip 333 8 4444443434343
Live_package2.zip 444 8 8888888886767
Live_package2.zip 444 10 8888888886767
Live_package3.zip 666 8 9999999999999
Live_package4.zip 111 9 3333333333333
想要的结果
File_name id status Execution_number
Live_package1.zip 333 8 4444443434343
Live_package3.zip 666 8 9999999999999
我使用以下代码,但没有收到我预期的结果:
SELECT *
FROM tbl_doc_state
WHERE status =8
AND NOT(status !=9);
是这样的吗?
SQL> select * From tbl_doc_state;
FIL ID STATUS EXECUTION_NUMBER
--- ---------- ---------- ----------------
lp1 333 3 43
lp2 444 7 67
lp1 333 8 43
lp2 444 10 67
lp3 666 8 99
lp4 111 9 33
6 rows selected.
SQL> with temp as
2 (select id,
3 max(status) max_status
4 from tbl_doc_state
5 group by id
6 )
7 select a.*
8 from tbl_doc_state a join temp t on a.id = t.id
9 and a.status = t.max_status
10 where t.max_status = 8;
FIL ID STATUS EXECUTION_NUMBER
--- ---------- ---------- ----------------
lp1 333 8 43
lp3 666 8 99
SQL>
如果要排除状态为 8 的行,但有 other 行具有相同的 ID 但状态为 9,请使用 not
存在条件:
SELECT t1.*
FROM tbl_doc_state t1
WHERE status = 8
and not exists (select *
from tbl_doc_state t2
where t2.id = t1.id
and t2.status >= 9);
您不知道应该使用哪一列来对记录进行排序。如果您为此使用 status
,则查询只是:
select * from tbl_doc_state where status = 8
如果 你有另一个排序列,比如说 sort_id
,那么这个问题就更有意义了。您可以使用 window 函数:
select t.*
from (
select t.*, max(case when status = 9 then 1 else 0 end) over(partition by id order by sort_id) has_status_9
from mytable t
) t
where status = 8 and has_status_9 = 0
使用window函数MAX()
:
select t.File_name, t.id, t.status, t.Execution_number
from (
select t.*, max(t.status) over(partition by t.id) max_status
from tbl_doc_state t
) t
where max_status = 8 and status = max_status
参见demo。
结果:
> File_name | id | status | Execution_number
> :---------------- | --: | -----: | :---------------
> Live_package1.zip | 333 | 8 | 4444443434343
> Live_package3.zip | 666 | 8 | 9999999999999
我正在做项目,我需要在 table 中找到一个名为 status 的列(这个列的值是 1-12),我想找到低于条件的所有值(如果 status有 8 个,但仍然没有 9 个),了解更多信息:
原文table:
File_name id status Execution_number
Live_package1.zip 333 3 4444443434343
Live_package2.zip 444 7 8888888886767
Live_package1.zip 333 8 4444443434343
Live_package2.zip 444 8 8888888886767
Live_package2.zip 444 10 8888888886767
Live_package3.zip 666 8 9999999999999
Live_package4.zip 111 9 3333333333333
想要的结果
File_name id status Execution_number
Live_package1.zip 333 8 4444443434343
Live_package3.zip 666 8 9999999999999
我使用以下代码,但没有收到我预期的结果:
SELECT *
FROM tbl_doc_state
WHERE status =8
AND NOT(status !=9);
是这样的吗?
SQL> select * From tbl_doc_state;
FIL ID STATUS EXECUTION_NUMBER
--- ---------- ---------- ----------------
lp1 333 3 43
lp2 444 7 67
lp1 333 8 43
lp2 444 10 67
lp3 666 8 99
lp4 111 9 33
6 rows selected.
SQL> with temp as
2 (select id,
3 max(status) max_status
4 from tbl_doc_state
5 group by id
6 )
7 select a.*
8 from tbl_doc_state a join temp t on a.id = t.id
9 and a.status = t.max_status
10 where t.max_status = 8;
FIL ID STATUS EXECUTION_NUMBER
--- ---------- ---------- ----------------
lp1 333 8 43
lp3 666 8 99
SQL>
如果要排除状态为 8 的行,但有 other 行具有相同的 ID 但状态为 9,请使用 not
存在条件:
SELECT t1.*
FROM tbl_doc_state t1
WHERE status = 8
and not exists (select *
from tbl_doc_state t2
where t2.id = t1.id
and t2.status >= 9);
您不知道应该使用哪一列来对记录进行排序。如果您为此使用 status
,则查询只是:
select * from tbl_doc_state where status = 8
如果 你有另一个排序列,比如说 sort_id
,那么这个问题就更有意义了。您可以使用 window 函数:
select t.*
from (
select t.*, max(case when status = 9 then 1 else 0 end) over(partition by id order by sort_id) has_status_9
from mytable t
) t
where status = 8 and has_status_9 = 0
使用window函数MAX()
:
select t.File_name, t.id, t.status, t.Execution_number
from (
select t.*, max(t.status) over(partition by t.id) max_status
from tbl_doc_state t
) t
where max_status = 8 and status = max_status
参见demo。
结果:
> File_name | id | status | Execution_number
> :---------------- | --: | -----: | :---------------
> Live_package1.zip | 333 | 8 | 4444443434343
> Live_package3.zip | 666 | 8 | 9999999999999