如果已经回答了这个问题,我很抱歉,但我的搜索结果中没有找到它。虽然看起来确实应该相对简单。
我正在尝试在表格中找到重复项。其中的一些数据来自我们已集成到此数据库中的遗留数据库。我们现在的规则当时没有强制执行,所以我们现在正在清理它。
可悲的是,我们的项目编号是字符串。一些项目编号具有前导零而其他项目编号没有。还有一些项目编号中有字母。
我需要找到具有相同根数的项目,而不管前导零。例如:
PROJ_NUM
021523
000345
21523
345
00345
我希望项目021523
为2,000345
为3。
我目前的代码如下:
SELECT LPAD(PROJ_NUM, 6, '0') PROJ_NUM
, PROJ_TYPE
, COUNT(LPAD(PROJ_NUM, 6, '0')) COUNT
FROM TABLE
HAVING COUNT(LPAD(PROJ_NUM, 6, '0')) > 1
GROUP BY LPAD(PROJ_NUM, 6, '0'), PROJ_TYPE
ORDER BY PROJ_TYPE, PROJ_NUM
任何帮助将不胜感激。感谢。
编辑:此查询需要Proj_Type,因为有不同的项目类型具有相同的项目编号,我不想将其视为重复项。
编辑:我发现我遇到的部分问题涉及使用项目编号尾随空格。目前我的代码是:
SELECT PROJ_NUM
, PROJ_TYPE
, CNT
FROM (
SELECT LPAD(PROJ_NUM, 6, '0') PROJ_NUM
, PROJ_TYPE
, COUNT(PROJ_NUM) CNT
FROM TABLE
GROUP BY LPAD(PROJ_NUM, 6, '0'), PROJ_TYPE
)
WHERE CNT > 1
AND PROJ_TYPE IS NOT NULL
ORDER BY PROJ_TYPE, PROJ_NUM
答案 0 :(得分:0)
如果你的项目编号是数字,你可以使用TO_NUMBER()来摆脱前导零。
SELECT COUNT(0), TO_NUMBER(PROJ_NUM) AS PROJ_NUM FROM TABLE GROUP BY TO_NUMBER(PROJ_NUM)
答案 1 :(得分:0)
我建议您使用ltrim()
删除前导零:
SELECT LTRIM(PROJ_NUM, '0') as PROJ_NUM, COUNT(*) as cnt
FROM TABLE
GROUP BY LTRIM(PROJ_NUM, '0')
HAVING COUNT(*) > 1;
您的问题中没有任何内容涉及项目类型,因此不包含在查询中。
答案 2 :(得分:0)
我创建了a SQLFiddle test case using your data并返回了您想要的结果。
但是,我为PROJ_TYPE
编制了值,因为您没有在示例数据中提供它们。我为每个项目分配了相同的类型,这就是我的查询有效的原因。也许在您的真实数据中,重复"项目有不同的类型?如果是这样,您的查询将不返回任何行。
解决这个问题的两种方法。第一个是显而易见的:从查询中删除PROJ_TYPE
。但是如果你想看到Type也可以使用带有分析计数的子查询来获取这些信息:请注意,此查询为每个Project返回一行:
select proj_num, proj_type from (
SELECT LPAD(PROJ_NUM, 6, '0') PROJ_NUM
, PROJ_TYPE
, count(*) over (partition by LPAD(PROJ_NUM, 6, '0')) cnt
FROM t23
)
where cnt > 1
ORDER BY proj_num, proj_type
/
这可能不是您正在寻找的解决方案。如果是这种情况,请编辑您的问题,为您尝试解决的问题提供更清晰的解释,并提供足够的示例数据供我们重现。