1

以下のような PostgreSQL テーブルがあります。

   PO Num  |  Salesman |   Phone   |  
-----------+-----------+-----------+
 PO13175   |  Sarah    |  111      |
 PO13203   |  Sarah    |  1111     |  
 PO12203   |  Tom      |  222      |  
 PO8656    |  Tom      |  222      |  
...
(n rows)   

セールスマンと電話番号はペアになっていますが、2 行目のような不一致をどのように特定できますか? (サラはトムと同じように一貫した電話番号を持つべきです)

「パーティション」を使ってみた

select *,Row_number() over (partition by Salesman,Phone) as row from table
where row>1;

しかし、それは私が望んでいたものを私に与えませんでした。

以下のようにレコードを取得したかった:

   PO Num  |  Salesman |   Phone   |  
-----------+-----------+-----------+
 PO13175   |  Sarah    |  111      |
 PO13203   |  Sarah    |  1111     |  
4

6 に答える 6

1

あなたはウィンドウ機能で正しい方向に進んでいました。以下は、矛盾した電話番号を持っているとして Sarah を返します。

select a.*
from
(select 
salesman
,phone
,count(*) as freq
,count(*)over(partition by salesman order by phone) as distinct_phone_num_id
from mydata /*replace this with your actual tablename*/
group by 
salesman
,phone) as a
inner join
(select distinct salesman from mydata) as b
on a.salesman=b.salesman and a.distinct_phone_num_id>1
;

説明:テーブルは最初に可能な&の組み合わせaをすべて数えます。次に、セールスマンごとに見つかった個別の電話番号を順番に列挙します。salesmanphonecount(*)over(partition by salesman order by phone)

SALESMAN PHONE FREQ DISTINCT_PHONE_NUM_ID 
Sarah   111     1   1 
Sarah   1111    1   2 
Tom     222     2   1 

DISTINCT_PHONE_NUM_IDしたがって、上で、 Sarah は最大 2 つの電話番号を持っており、Tom は 1 つの異なる番号しか持っていないことがわかります。

の目的は、一貫性のない電話番号inner joinのリストを提供することです。salesman

最終出力:

SALESMAN PHONE FREQ DISTINCT_PHONE_NUM_ID 
Sarah   1111    1   2 
于 2013-10-02T10:19:13.703 に答える
0

単純な group by / having を使用して結果をクエリすることもできます。

select salesman
from sales
group by salesman
having count(distinct phone) > 1
于 2013-10-02T12:52:24.247 に答える
0

この種の問題を回避するには、データベース スキーマを NORMALIZE する必要があります。

select * from t as t1
where EXISTS(select 1 from t 
                where t.salesman=t1.salesman 
                  and t.phone<>t1.phone)

SQLFiddle デモ

于 2013-10-02T11:01:03.597 に答える
0
SELECT *
FROM tbl t1
JOIN tbl t2
  ON (t1.salesman = t2.salesman AND t1.phone <> t2.phone AND t1.po_num <> t2.po_num)
GROUP BY t1.salesman;

それがうまくいけば面白いでしょう。

于 2013-10-02T10:22:15.293 に答える
0
SELECT  *
FROM lutser_table lt
WHERE EXISTS (
   SELECT * FROM lutser_table ex
   WHERE ex.Salesman = lt.Salesman
   AND ex.Phone <> lt.Phone
   );
于 2013-10-02T10:24:24.770 に答える
0

select * from x where Salesman in(select salesman from table_name group by salesman with count(distinct phone) > 1)

これが与えることを願っています

于 2013-10-03T05:03:11.950 に答える