排除组中的第一行

时间:2014-06-11 22:36:03

标签: sql oracle

我正在尝试创建一个表,其中所有行的编号(REC_NUM)重复列ACCIDENT_REC_NUM和VEHICLE_REC_NUM。所以我需要从所有可以通过这两个字段分组的行中获取代码。

这部分没问题,您可以通过此查询进行检查:

SELECT COUNT(REC_NUM)  FROM SEQUENCE_EVENT WHERE ACCIDENT_REC_NUM IN (
  SELECT ACCIDENT_REC_NUM
  FROM (
    select ACCIDENT_REC_NUM, VEHICLE_REC_NUM, COUNT(*) AS REPEAT  from SEQUENCE_EVENT
    GROUP BY ACCIDENT_REC_NUM, VEHICLE_REC_NUM
  )
  WHERE REPEAT > 1
)

所以,现在我必须排除每个组的第一行,因为我只需要重复行的REC_NUM,所以第一行是正确的。

2 个答案:

答案 0 :(得分:0)

如何确定哪一行是该组中的“第一”?

假设REC_NUM表上的SEQUENCE_EVENT是唯一且非空的,您可以执行类似的操作,以排除每个组中REC_NUM值最低的行:

SELECT COUNT(e.rec_num)
  FROM sequence_event e
  JOIN ( SELECT MIN(c.rec_num) AS first_rec_num
              , c.accident_rec_num
              , c.vehicle_rec_num
          FROM sequence_event c
         GROUP
            BY c.accident_rec_num
             , c.vehicle_rec_num
        HAVING COUNT(*) > 1
       ) r
    ON r.accident_rec_num = e.accident_rec_num
   AND r.first_rec_num <> e.rec_num

如果没有您希望返回的结果集样本,那就是我们所能做的一切。原始查询返回带有计数的单行;所以上面的查询做了同样的事情,除了它从计数中排除了每个组的一些“第一”行。

答案 1 :(得分:0)

我强烈建议您使用分析函数执行此操作。我认为以下内容明确地表达了您想要的内容:

select count(*)
from (select se.*,
             count(*) over (partition by accident_rec_num, vehicle_rec_num) as repeat,
             row_number() over (partition by accident_rec_num, vehicle_rec_num
                                order by rec_num) as seqnum
      from sequence_event se
     ) t
where repeat > 1 and seqnum > 1;

我并非100%确定这是确切的查询,因为我不确定事故和车辆数量如何相互作用。