SQL:与其他变量一起获取重复行

SQL:与其他变量一起获取重复行,sql,database,teradata,Sql,Database,Teradata,我正在研究Terradata SQL。我想得到重复字段及其计数和其他变量。我只能找到获取计数的方法,但不能准确地获取变量 可用输入 +---------+----------+----------------------+ | id | name | Date | +---------+----------+----------------------+ | 1 | abc | 21.03

我正在研究Terradata SQL。我想得到重复字段及其计数和其他变量。我只能找到获取计数的方法,但不能准确地获取变量

可用输入

   +---------+----------+----------------------+
    | id      | name     |      Date       |
    +---------+----------+----------------------+
    | 1       | abc      |         21.03.2015   |
    | 1       | def      |          22.04.2015  |
    | 2       | ajk      |          22.03.2015  |
    | 3       | ghi      |          23.03.2015  |
    | 3       | ghi      |          23.03.2015  |
预期产出:

    +---------+----------+----------------------+
    | id     | name     |      count            | // Other fields
    +---------+----------+----------------------+
    | 1       | abc      |            2         |
    | 1       | def      |            2         |
    | 2       | ajk      |            1         |
    | 3       | ghi      |            2         |
    | 3       | ghi      |            2         |
我在寻找什么:

我正在查找所有重复的行,其中重复由ID决定,并检索重复的行。

到目前为止,我只有:

SELECT
    id, name, other-variables, COUNT(*)
FROM
    Table_NAME
GROUP BY
    id, name
HAVING 
    COUNT(*) > 1
这显示的数据不正确。多谢各位

你可以使用一个类似这样的

SELECT *
FROM   (
        SELECT id, name, other-variables,
               COUNT(*) OVER (PARTITION BY id) AS duplicates
        FROM   users
       ) AS sub
WHERE  duplicates > 1
使用teradata对ISO SQL语法的扩展,您可以将上述内容简化为:

SELECT  id, name, other-variables,
        COUNT(*) OVER (PARTITION BY id) AS duplicates
FROM    users
QUALIFY duplicates > 1
你可以用一个,像这样:

SELECT *
FROM   (
        SELECT id, name, other-variables,
               COUNT(*) OVER (PARTITION BY id) AS duplicates
        FROM   users
       ) AS sub
WHERE  duplicates > 1
使用teradata对ISO SQL语法的扩展,您可以将上述内容简化为:

SELECT  id, name, other-variables,
        COUNT(*) OVER (PARTITION BY id) AS duplicates
FROM    users
QUALIFY duplicates > 1
试试这个

SELECT
    id, COUNT(id)
FROM
    Table_NAME
GROUP BY
    id
HAVING 
    COUNT(id) > 1
试试这个

SELECT
    id, COUNT(id)
FROM
    Table_NAME
GROUP BY
    id
HAVING 
    COUNT(id) > 1

作为公认且完全正确答案的替代方案,您可以使用:

SELECT          {all your required 'variables' (they are not variables, but attributes)}
,               cnt.Count_Dups
FROM            Table_NAME TN
INNER JOIN      (
                     SELECT  id
                     ,       COUNT(1) Count_Dups
                     GROUP BY id
                     HAVING   COUNT(1) > 1 -- If you want only duplicates
                ) cnt
           ON   cnt.id = TN.id

编辑:根据您的编辑,副本仅在
id
上。相应地编辑了我的查询

作为公认且完全正确答案的替代方案,您可以使用:

SELECT          {all your required 'variables' (they are not variables, but attributes)}
,               cnt.Count_Dups
FROM            Table_NAME TN
INNER JOIN      (
                     SELECT  id
                     ,       COUNT(1) Count_Dups
                     GROUP BY id
                     HAVING   COUNT(1) > 1 -- If you want only duplicates
                ) cnt
           ON   cnt.id = TN.id


编辑:根据您的编辑,副本仅在
id
上。相应地编辑了我的查询

您的预期结果与您在尝试中选择的列完全不匹配。请提供您实际试图获取的内容。如果您有一个计算重复项的查询,但没有额外属性,则将其放入子查询中,并将其连接到外部查询,该查询还可以获取所需的额外属性。@TomH:对不起,我之前刚刚粘贴了在链接中找到的查询,修改了查询。谢谢。:-)@我们是博格,因为您使用的是Count(*),所以必须了解“其他变量”。请提供详细的查询。@HoneyBadger:我不明白您所说的,我也按照Tom的建议编辑了这篇文章。现在请检查查询的外观。:-)您的预期结果与您在尝试中选择的列完全不匹配。请提供您实际试图获取的内容。如果您有一个计算重复项的查询,但没有额外属性,则将其放入子查询中,并将其连接到外部查询,该查询还可以获取所需的额外属性。@TomH:对不起,我之前刚刚粘贴了在链接中找到的查询,修改了查询。谢谢。:-)@我们是博格,因为您使用的是Count(*),所以必须了解“其他变量”。请提供详细的查询。@HoneyBadger:我不明白您所说的,我也按照Tom的建议编辑了这篇文章。现在请检查查询的外观。:-)谢谢你的回答,这个似乎有效。唯一的问题是,名称是加密的,因为我们使用了一个函数,比如select id、decrypt_funct(name)和其他变量。当我这样做的时候,它不起作用。错误:派生表中的所有表达式必须具有显式名称。谢谢。:-)只需在计算列后面添加一个别名:
decrypt_funct(name)as mycl
我刚刚添加decrypt_funct(name)as“mm”就行了。谢谢,沙哈,我刚刚做到了。。谢谢我的朋友…-)您可以简单地使用Teradata SQL扩展名,
QUALIFY duplicates>1
谢谢您的回答,而不是一个派生表plus,它似乎可以工作。唯一的问题是,名称是加密的,因为我们使用了一个函数,比如select id、decrypt_funct(name)和其他变量。当我这样做的时候,它不起作用。错误:派生表中的所有表达式必须具有显式名称。谢谢。:-)只需在计算列后面添加一个别名:
decrypt_funct(name)as mycl
我刚刚添加decrypt_funct(name)as“mm”就行了。谢谢,沙哈,我刚刚做到了。。谢谢我的朋友…-)与可以简单使用Teradata SQL扩展的派生表plus不同,
QUALIFY duplicates>1
SQL Server不涉及此问题。请参阅标签
teradata
@trincot,编辑答案。我对teradata一点也不了解,但这应该仍然有效,我认为SQL Server不涉及这个问题。请参阅标签
teradata
@trincot,编辑答案。我一点也不知道teradata,但这应该仍然有效,我想您还没有显示名称。例外结果有3列。除了粘贴一堆随机代码之外,请解释您所做的事情以及原因。这样,OP和任何未来有同样问题的读者实际上可以从你的答案中学到一些东西,而不仅仅是复制/粘贴它,然后明天再问同样的问题。你没有显示名称。例外结果有3列。除了粘贴一堆随机代码之外,请解释您所做的事情以及原因。这样,OP和任何未来有同样问题的读者都可以从你的答案中学到一些东西,而不仅仅是复制/粘贴答案,明天再问同样的问题。