【问题标题】:How to find values of column status that have 8 but still do not have 9如何查找具有 8 但仍然没有 9 的列状态值
【发布时间】:2020-10-02 08:42:35
【问题描述】:

我正在处理项目,我需要在表中找到名为状态的一列(此列的值从 1-12 ),我想找到低于条件的所有值(如果状态有 8 但仍然没有有 9),了解更多信息:

原表:

    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);

【问题讨论】:

  • 为什么要添加条件NOT(status !=9)?就这样吧……只要 ast WHERE status = 8 就足够了,这意味着 status 不是 9
  • 因为每个** id** 都有多个状态(1-12),我只需要具有 8 个状态但仍然没有 9 或 10 个状态的 id
  • 不要标记 3 个完全不同的 RDBMS。只标记您真正使用的RDBMS。我已经删除了所有冲突的标签,edit 你的问题是正确的only
  • where status = 8 仅选择列具有值8 的那些行。所以它永远不会是 9 - not (status <> 9)status = 9 相同,status = 8 and status = 9 永远不会是真的
  • 我怀疑 OPs 样本数据并没有讲述真实的故事,@deHaar,并且一行(比如 id 666)也可能有一行状态为 9;样本并不能很好地反映真正的问题。

标签: sql subquery window-functions


【解决方案1】:

如果您想排除状态为 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);

【讨论】:

  • OP 评论(问题评论)他想要所有的 id 有一个 status = 8 而没有 status >= 9...
【解决方案2】:

这样的?

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>

【讨论】:

  • 它工作得很好,你是最好的,非常感谢你另一个我想按 id 分组的问题,我可以这样做吗?
【解决方案3】:

您不知道应该使用哪一列对记录进行排序。如果您为此使用status,那么查询就是:

select * from tbl_doc_state where status = 8

如果你有另一个排序列,比如sort_id,那么这个问题就更有意义了。您可以使用窗口函数:

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

【讨论】:

  • 这就是我喜欢 stackoverflow 的原因,因为他有很多像你这样的皇室和聪明人 .. 非常感谢,这对我很有帮助 :)
【解决方案4】:

带窗口函数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 

【讨论】:

  • 当我运行它时它非常有用和快速,非常感谢
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多