SQL 查询:如何 select 单个项目的多个实例而不折叠成一个组?
SQL Query: How to select multiple instances of a single item without collapsing into a group?
我正在尝试使用 Impala 中的 SQL 查询进行跟踪。我有一个数据 table,它有(除其他外)两列,其值相交多次。例如,假设我们有一个 table,其中有两列用于相关名称和 phone 数字:
Names Phone Numbers
John Smith (123) 456-7890
Rob Johnson (123) 456-7890
Greg Jackson (123) 456-7890
Tom Green (123) 456-7890
Jack Mathis (123) 456-7890
John Smith (234) 567-8901
Rob Johnson (234) 567-8901
Joe Wolf (234) 567-8901
Mike Thomas (234) 567-8901
Jim Moore (234) 567-8901
John Smith (345) 678-9012
Rob Johnson (345) 678-9012
Toby Ellis (345) 678-9012
Sam Wharton (345) 678-9012
Bob Thompson (345) 678-9012
John Smith (456) 789-0123
Rob Johnson (456) 789-0123
Kelly Howe (456) 789-0123
Hank Rehms (456) 789-0123
Jim Fellows (456) 789-0123
我需要从这个 table 中得到的是从 Name 列中选择的每个项目,这些项目有来自 Phone Numbers 列的多个条目与之关联,如下所示:
Names Phone Numbers
John Smith (123) 456-7890
John Smith (234) 567-8901
John Smith (345) 678-9012
John Smith (456) 789-0123
Rob Johnson (123) 456-7890
Rob Johnson (234) 567-8901
Rob Johnson (345) 678-9012
Rob Johnson (456) 789-0123
这是我目前得到的查询,但它并没有给我想要的结果:
SELECT a.name, a.phone_number, b.phone_number, b.count1
FROM databasename a
INNER JOIN (
SELECT phone_number, COUNT(phone_number) as count1
FROM databasename
GROUP BY phone_number
) b
ON a.phone_number = b.phone_number;
关于如何改进我的查询以获得我正在寻找的结果的任何想法?
谢谢。
一种方法是使用exists:
select t.*
from tablename t
where exists (select 1 from tablename t2 where t2.name = t.name and t2.phonenumber <> t.phonenumber)
SELECT DISTINCT x.*
FROM my_table x
JOIN my_table y
ON y.name = x.name
AND y.phone <> x.phone;
正在处理您的查询...
这会根据拥有超过 1 个 phone 号码的用户的姓名生成一个子集,然后根据名称返回整个集合,为拥有超过 1 个 [=] 的用户返回所有 phone 个号码15=] 数。但是,如果用户多次列出相同的 phone 号码,它将被退回。要在需要时消除这些,请在内联视图中向计数添加不同。
SELECT a.name, a.phone_number
FROM databasename a
INNER JOIN (
SELECT name, COUNT(phone_number) as count1
FROM databasename
GROUP BY name
having COUNT(phone_number) > 1
) b
on a.name = b.name
Order by a.name, a.phone_Number
我正在尝试使用 Impala 中的 SQL 查询进行跟踪。我有一个数据 table,它有(除其他外)两列,其值相交多次。例如,假设我们有一个 table,其中有两列用于相关名称和 phone 数字:
Names Phone Numbers
John Smith (123) 456-7890
Rob Johnson (123) 456-7890
Greg Jackson (123) 456-7890
Tom Green (123) 456-7890
Jack Mathis (123) 456-7890
John Smith (234) 567-8901
Rob Johnson (234) 567-8901
Joe Wolf (234) 567-8901
Mike Thomas (234) 567-8901
Jim Moore (234) 567-8901
John Smith (345) 678-9012
Rob Johnson (345) 678-9012
Toby Ellis (345) 678-9012
Sam Wharton (345) 678-9012
Bob Thompson (345) 678-9012
John Smith (456) 789-0123
Rob Johnson (456) 789-0123
Kelly Howe (456) 789-0123
Hank Rehms (456) 789-0123
Jim Fellows (456) 789-0123
我需要从这个 table 中得到的是从 Name 列中选择的每个项目,这些项目有来自 Phone Numbers 列的多个条目与之关联,如下所示:
Names Phone Numbers
John Smith (123) 456-7890
John Smith (234) 567-8901
John Smith (345) 678-9012
John Smith (456) 789-0123
Rob Johnson (123) 456-7890
Rob Johnson (234) 567-8901
Rob Johnson (345) 678-9012
Rob Johnson (456) 789-0123
这是我目前得到的查询,但它并没有给我想要的结果:
SELECT a.name, a.phone_number, b.phone_number, b.count1
FROM databasename a
INNER JOIN (
SELECT phone_number, COUNT(phone_number) as count1
FROM databasename
GROUP BY phone_number
) b
ON a.phone_number = b.phone_number;
关于如何改进我的查询以获得我正在寻找的结果的任何想法?
谢谢。
一种方法是使用exists:
select t.*
from tablename t
where exists (select 1 from tablename t2 where t2.name = t.name and t2.phonenumber <> t.phonenumber)
SELECT DISTINCT x.*
FROM my_table x
JOIN my_table y
ON y.name = x.name
AND y.phone <> x.phone;
正在处理您的查询...
这会根据拥有超过 1 个 phone 号码的用户的姓名生成一个子集,然后根据名称返回整个集合,为拥有超过 1 个 [=] 的用户返回所有 phone 个号码15=] 数。但是,如果用户多次列出相同的 phone 号码,它将被退回。要在需要时消除这些,请在内联视图中向计数添加不同。
SELECT a.name, a.phone_number
FROM databasename a
INNER JOIN (
SELECT name, COUNT(phone_number) as count1
FROM databasename
GROUP BY name
having COUNT(phone_number) > 1
) b
on a.name = b.name
Order by a.name, a.phone_Number