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 のウィンドウ関数 (分析関数とも呼ばれます) を使用しています。この式count(*) over (partition by house_number, street)は、house_number と street の各組み合わせの行数をカウントしています。の実行に似ていgroup byますが、複数の行を 1 つに結合するのではなく、各行にカウントを追加します。

それができたら、値が 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

NOTDISTINCTが必要なようです。以下はあなたが必要とするものをあなたに与えるかもしれません:複数の明確ではない

于 2013-02-21T23:15:17.817 に答える
0

ウィンドウ機能がない場合は、JOIN. サブクエリは、カウントが 1 より大きいhouse_numberandのリストを取得します。この結果は、テーブルに結合するために使用されます。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 に答える