【问题标题】:Comparing and displaying the values in the same table in sqlplus在sqlplus中比较并显示同一张表中的值
【发布时间】:2019-11-27 20:59:16
【问题描述】:

我是 sqlplus 的新手,我对这个主题的了解非常有限,谁能帮助我:

我有一个包含以下列的表:代码、值和日期

这里代码列中有2种类型的值,例如:ABC.1和DEF.1。这里 DEF.1 包含所有日期的值,但 ABC.1 并非如此,它缺少某些日期的值。如果 DEF.1 中有特定日期的值并且同一日期的 ABC.1 中不存在该值,我正在尝试编写一个查询来提取数据。

例如:

+------------------------------+
| Code    Value     Date       |
+------------------------------+
| DEF.1    44       22-11-2019 |
+------------------------------+
| ABC.1    23       23-11-2019 |
+------------------------------+
| DEF.1    12       23-11-2019 |
+------------------------------+
| ABC.1    99       24-11-2019 |
+------------------------------+
| DEF.1    23       24-11-2019 |
+------------------------------+

这里 ABC.1 没有日期 22-11-2019 的值,所以对于那个日期,我想提取 DEF.1 的值

【问题讨论】:

  • 你的意思是说你想要多一行像ABC.1 , 44 ,22-11-2019
  • 不,只需要显示值 DEF.1, 44, 22-11-2019。年份范围从 2017 年到 2019 年
  • 我需要将值导出到 csv 文件中,以记录 DEF.1 存在哪些值,而不是 ABC.1。
  • 是否每天都有一个可能的行,或者您是否有可能在同一天有两行 DEF.1? ABC.1 是否可能存在一个日期但 DEF.1 丢失?示例:DEF.1 , 44 ,22-11-2019 DEF.1 , 90 ,22-11-2019
  • 是的,同一日期有多个值,并且代码 DEF.1 没有丢失任何日期的任何值。

标签: sql oracle


【解决方案1】:

最简单也可能最快的方法是分析count

select code, value, date_
  from (
    select code, value, date_, 
           count(case code when 'ABC.1' then 1 end) over (partition by date_) c1,
           count(case code when 'DEF.1' then 1 end) over (partition by date_) c2
      from tbl t)
  where c1 <> c2

dbfiddle demo

您也可以使用not existsnot in 和分组,但如果您想要详细信息,anaytic 方法是最短的。此查询显示 count 不同的所有行,因此如果有 3 个 ABC 和 5 个 DEF 您将获得该日期的 8 行。如果缺少行,它也可以工作,就像你的例子一样。 Date 是保留字,所以我加了下划线。

【讨论】:

    【解决方案2】:

    我会使用not exists 来解决这个问题:

    select t.*
    from t
    where t.code = 'DEF.1' and
          not exists (select 1
                      from t t2
                      where t2.date = t.date and t2.code = 'ABC.1'
                     );
    

    (date, code) 上有一个索引,我希望它有很好的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      相关资源
      最近更新 更多