【问题标题】:Trying to select all records where two fields are distinct (but the rest don't have to be)尝试选择两个字段不同的所有记录(但其他字段不必如此)
【发布时间】:2013-06-22 02:37:59
【问题描述】:

我有一个包含 14 列的表。这些列是颜色、类型、英尺、日期、计数等。我需要的是选择所有不同的 id 记录和最近日期的类型。所以,例如...

颜色------类型-----------日期

红色--------工作-----------01/01/01

红色---------播放----------02/02/02

红色---------播放----------03/03/03

在这种情况下,我想返回红色,工作,01/01/01 和红色,播放 03/03/03。希望这是有道理的。我尝试了 select unique 和 select distinct 和 group bys 的不同组合,但我无法提出任何建议。

这是我正在尝试的 SQL 语句:

select distinct
  chock_id, 
  roll_type, 
  max(chock_service_dt), 
  chock_id_dt, 
  chock_seq_num, 
  chock_service_cmnt, 
  total_rolled_lineal_ft, 
  total_rolled_tons, 
  chock_usage_cnt, 
  chock_insert_dt, 
  record_modify_dt, 
  next_chock_service_dt_act,
  previous_alarm_value, 
  upload_complete_yn 
from 
  tp07_chock_summary_row 
group by 
  chock_id, 
  roll_type,
  chock_service_dt, 
  chock_id_dt, 
  chock_seq_num, 
  chock_service_cmnt, 
  total_rolled_lineal_ft, 
  total_rolled_tons, 
  chock_usage_cnt, 
  chock_insert_dt, 
  record_modify_dt, 
  next_chock_service_dt_act,
  previous_alarm_value, 
  upload_complete_yn;

这是一个屏幕截图。就像我在下面的评论中所说的那样,就像在第 2 行和第 4 行中一样,我不能有多个具有相同 chock_id 和 roll_type 的记录。

【问题讨论】:

  • 那么,对于chock_idroll_type 的特定组合,在所有chock_seq_num(和其他列)中,您想要哪一个?
  • 我不完全确定我是否理解这个问题。我在OP中发布了截图。看看第 2 行和第 4 行都是蓝色/工作的吗?我不能拥有那个。我只能有一个绿色/工作,蓝色/工作等。
  • 因此对于“绿色”和“工作”的组合,您在 chock_seq_num 列中有几个不同的值(我也可能在其他列中假设)。由于您希望输出中只有一行带有“green”和“work”,您希望看到chock_seq_num 的许多可能值中的哪一个?
  • 我只想要最近 chock_service_dt 的记录。基本上,它是一个在 chock_service_dt 上被替换的硬件,因此所有旧数据都是不必要的。我只想要 chock_id 和 roll_type 的每个组合的最近日期。
  • 所以,应该只有 9 行。应该有黑色/工作,蓝色工作,蓝色工作,绿色工作,绿色工作,灰色工作,红色工作,白色工作和黄色工作。但我需要日期最近的那个,以及它们各自列中的所有其他数据。所以,我希望有 9 条记录,每条记录有 14 列数据。它应该是最新的 chock_service_dt

标签: oracle


【解决方案1】:

鉴于您最初没有解释的新要求,应该这样做:

  select 
    chock_id, 
    roll_type, 
    chock_service_dt,
    chock_id_dt, 
    chock_seq_num, 
    chock_service_cmnt, 
    total_rolled_lineal_ft, 
    total_rolled_tons, 
    chock_usage_cnt, 
    chock_insert_dt, 
    record_modify_dt, 
    next_chock_service_dt_act,
    previous_alarm_value, 
    upload_complete_yn 
  from (
     select 
       chock_id, 
       roll_type, 
       chock_service_dt,
       chock_id_dt, 
       chock_seq_num, 
       chock_service_cmnt, 
       total_rolled_lineal_ft, 
       total_rolled_tons, 
       chock_usage_cnt, 
       chock_insert_dt, 
       record_modify_dt, 
       next_chock_service_dt_act,
       previous_alarm_value, 
       upload_complete_yn,
       row_number() over (
         partition by chock_id, roll_type
         order by chock_service_dt desc
       ) rn
     from
       tp07_chock_summary_row 
  ) where rn = 1

【讨论】:

  • 哇哦!做到了。对于一开始的糟糕要求,我真的很抱歉。我不太会说话。接受!
【解决方案2】:
select color, type, max(date)
from ...
group by color, type

【讨论】:

    【解决方案3】:
    select 
     color,
     type,
     max(date)
    from
     yourtable
    group by
     color,
     type
    

    【讨论】:

    • 在此处复制/粘贴您的 SQL*Plus 会话。
    • This is what I'm typing select chock_id, roll_type, max(chock_service_dt), chock_id_dt, chock_seq_num, chock_service_cmnt, total_rolled_lineal_ft, total_rolled_tons, chock_usage_cnt, chock_insert_dt, record_modify_dt, next_chock_service_dt_act, previous_alarm_value, upload_complete_yn from tp07_chock_summary_row group by chock_id, roll_type;
    • 这与您的要求不符。 SELECT 列表中的所有非聚合列必须在 GROUP BY 子句中引用。
    • 好的,我将所有其他列放在 Group by 中。这给了我数据,但它给了我所有的数据。有关我输入的内容,请参见上文。这并没有给我独特的颜色,请输入组合。
    猜你喜欢
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 2013-08-26
    • 2017-07-31
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多