我正在尝试创建一个表,其中所有行的编号(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,所以第一行是正确的。
答案 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%确定这是确切的查询,因为我不确定事故和车辆数量如何相互作用。