如何查找具有 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