3

我正在尝试

select columns Age, Height, House_number, Street
from my_table
where count(combination of House_number, Street)
occurs more than once.

我的桌子看起来像这样

Age, Height, House_number, Street
15   178     6             Mc Gill Crst 
85   166     6             Mc Gill Crst
85   166     195           Mc Gill Crst
18   151     99            Moon Street 
52   189     14a           Grimm Lane

我想要的结果看起来像这样

Age, Height, House_number, Street
15   178     6             Mc Gill Crst 
85   166     6             Mc Gill Crst

卡住!

4

4 回答 4

6

最好的方法是使用窗口函数,假设您的数据库支持它们:

select columns Age, Height, House_number, Street
from (select t.*, count(*) over (partition by house_number, street) as cnt
      from my_table t
     ) t
where cnt > 1

这是在 Oracle 中使用 Windows 函数(也称为分析函数)。该表达式count(*) over (partition by house_number, street)正在计算每个 house_number 和街道组合的行数。这有点像做 a group by,但它将计数添加到每一行,而不是将多行合并为一个。

一旦你有了它,就很容易选择值大于 1 的行。

于 2013-02-21T23:06:55.723 回答
2

由于您没有提到您正在使用的 RDBMS,因此下面的查询几乎适用于大多数 RDBMS。

SELECT  *
FROM    tableName
WHERE   (House_number, Street) IN
(
    SELECT House_number, STREET
    FROM tableName
    GROUP BY House_number, STREET
    HAVING COUNT(*) >= 2
)
于 2013-02-21T23:06:41.453 回答
0

听起来你需要一个 NOT DISTINCT。以下内容可能会满足您的需要:多个 NOT distinct

于 2013-02-21T23:15:17.817 回答
0

如果您没有窗口功能,那么您可以使用带有JOIN. 子查询获取计数大于 1的house_number和的列表,然后使用此结果连接回您的表:street

select t1.age,
  t1.height,
  t1.house_number,
  t1.street
from my_table t1
inner join
(
  select house_number, street
  from my_table 
  group by house_number, street
  having count(*) > 1
) t2
  on t1.house_number = t2.house_number
  and t1.street = t2.street

请参阅带有演示的 SQL Fiddle

于 2013-02-21T23:16:19.060 回答