2016-09-26 9 views
1

特定のプロパティを含む特定の行のみを選択しようとしています。ここで私が働いているデータのサンプルです:私がやりたいことはmcpに等しい少なくとも1 cand_sourceを持つだけsrc_idの選択である特定のプロパティを持つグループ化された行を選択します。

 
src_id            cand_source 
------            ----------- 
201609-004d7bgNDFXuIrQPXwsXrOptt2PdTdeXsjV5RJ6_mEQ mcp 
201609-004d7bgNDFXuIrQPXwsXrOptt2PdTdeXsjV5RJ6_mEQ mc2 
201609-00WmbmuIp3cwAcTNTbrgb9tTVR0AKNf-RvjXcHWPEEQ mc2 
201609-00WmbmuIp3cwAcTNTbrgb9tTVR0AKNf-RvjXcHWPEEQ mc2 
201609-00WmbmuIp3cwAcTNTbrgb9tTVR0AKNf-RvjXcHWPEEQ mc2 
201609-00WmbmuIp3cwAcTNTbrgb9tTVR0AKNf-RvjXcHWPEEQ mc2 
201609-00WmbmuIp3cwAcTNTbrgb9tTVR0AKNf-RvjXcHWPEEQ mc2 
201609-00WmbmuIp3cwAcTNTbrgb9tTVR0AKNf-RvjXcHWPEEQ mc2 
201609-01My_orS795Hmomry3-JiCiBVimarRzRGQ9Cnornp8Q mcp 
201609-01My_orS795Hmomry3-JiCiBVimarRzRGQ9Cnornp8Q mcp 
201609-01My_orS795Hmomry3-JiCiBVimarRzRGQ9Cnornp8Q mc2 
201609-01My_orS795Hmomry3-JiCiBVimarRzRGQ9Cnornp8Q mcp 
201609-01My_orS795Hmomry3-JiCiBVimarRzRGQ9Cnornp8Q mc2 
201609-01noPFGBCqbH9jUB9MHNqPynjqW8cr24LJY917vSGTs mc2 
201609-01noPFGBCqbH9jUB9MHNqPynjqW8cr24LJY917vSGTs mc2 
201609-02ISoPEX0VVkQ0ogot49Q-e7K39Zyk2vdN1rB4Q-kl0 mc2 
201609-02ISoPEX0VVkQ0ogot49Q-e7K39Zyk2vdN1rB4Q-kl0 mc2 
201609-02LVZ8UqAaz7JCp3RAOTiIE7zH2mveiSQPBo6I6dHDc mc2 
201609-02LVZ8UqAaz7JCp3RAOTiIE7zH2mveiSQPBo6I6dHDc mc2 
201609-03dLH32kaKYVwIj4HiT1tZjCNgqgXiG-fvezX3S9QI4 mc2 
201609-03dLH32kaKYVwIj4HiT1tZjCNgqgXiG-fvezX3S9QI4 mc2 
201609-0421Jatpsk9T8GOD1M_GvDrnyV4dA41IL5tDeuTxGwU mc2 
201609-0421Jatpsk9T8GOD1M_GvDrnyV4dA41IL5tDeuTxGwU mc2 
201609-0421Jatpsk9T8GOD1M_GvDrnyV4dA41IL5tDeuTxGwU mc2 
201609-0421Jatpsk9T8GOD1M_GvDrnyV4dA41IL5tDeuTxGwU mc2 
201609-0421Jatpsk9T8GOD1M_GvDrnyV4dA41IL5tDeuTxGwU mc2 
201609-0421Jatpsk9T8GOD1M_GvDrnyV4dA41IL5tDeuTxGwU mc2 
201609-0421Jatpsk9T8GOD1M_GvDrnyV4dA41IL5tDeuTxGwU mc2 
201609-0421Jatpsk9T8GOD1M_GvDrnyV4dA41IL5tDeuTxGwU mc2 
201609-0421Jatpsk9T8GOD1M_GvDrnyV4dA41IL5tDeuTxGwU mc2 
201609-04HzM6NBIx_6QN91xzF9_p0RGfAQcRMeEhVFEPFZ8p4 mcp 
201609-04HzM6NBIx_6QN91xzF9_p0RGfAQcRMeEhVFEPFZ8p4 mc2 
201609-04HzM6NBIx_6QN91xzF9_p0RGfAQcRMeEhVFEPFZ8p4 mc2 
201609-04HzM6NBIx_6QN91xzF9_p0RGfAQcRMeEhVFEPFZ8p4 mc2 
201609-04HzM6NBIx_6QN91xzF9_p0RGfAQcRMeEhVFEPFZ8p4 mc2 
201609-04HzM6NBIx_6QN91xzF9_p0RGfAQcRMeEhVFEPFZ8p4 mc2 
201609-04HzM6NBIx_6QN91xzF9_p0RGfAQcRMeEhVFEPFZ8p4 mc2 
201609-04HzM6NBIx_6QN91xzF9_p0RGfAQcRMeEhVFEPFZ8p4 mc2 
201609-04HzM6NBIx_6QN91xzF9_p0RGfAQcRMeEhVFEPFZ8p4 mc2 
201609-04JzR3AMxsfQvAeq1MAgjCtMhcaqt2Z_WNmuUlYLrLM mc2 
201609-04JzR3AMxsfQvAeq1MAgjCtMhcaqt2Z_WNmuUlYLrLM mcp 

。ここで私が試したものです:

SELECT * 
FROM schema.table 
WHERE src_id IN (
    SELECT src_id 
    FROM schema.table 
    WHERE batch_id = ? 
    GROUP BY src_id 
    HAVING count(cand_source = 'mcp') > 1 
) 
ORDER BY src_id, 
    match_score DESC 

、しかし、mcpに等しい何cand_source秒を持っていないsrc_id秒のクラスターを私に恩返し保持していること。


私は単純に問題を複雑にしていると指摘しました。

SELECT * 
FROM schema.table 
WHERE src_id IN (
    SELECT DISTINCT src_id 
    FROM schema.table 
    WHERE batch_id = ? 
     AND cand_source = 'mcp' 
) 
ORDER BY src_id, 
    match_score DESC 

答えて

1

あなたは、単にMCPを持ってsrc_idをしたい場合は、WHERE句とストレートクエリが十分であるか:

SELECT src_id 
FROM schema.table 
WHERE batch_id = ? 
GROUP BY src_id 
HAVING SUM(case when cand_source = 'mcp' then 1 else 0 end) > 1 

より簡潔なバージョンがある:ここでは詳細なロジックではありません何でもあなたは、少なくとも1 cand_sourceを持つ各src_idのレコードのすべてをしたい場合は

SELECT DISTINCT 
    src_id 
FROM 
    Table 
WHERE 
    cand_source = 'mcp' 
    AND batch_id = ? 

あなたは、すべてのレコードを受け取るために、テーブルにそれをバックに参加することができます。

SELECT t.* 
FROM 
    Table t 
INNER JOIN 
    (SELECT DISTINCT src_id 
    FROM Table 
    WHERE cand_source = 'mcp' 
     AND batch_id = ?) d ON t.src_id = d.src_id 
          AND t.batch_id = ? 

また、すばらしいウィンドウ関数を使用して共通テーブル式を使用することもできます。

WITH cte AS 
(
    SELECT *, COUNT(CASE WHEN cand_source = 'mcp' THEN cand_source END) OVER (PARTITION BY src_id) as McpCount 
    FROM 
     Table 
    WHERE 
     batch_id = ? 

) 
SELECT * 
FROM 
    cte 
WHERE 
    McpCount > 0; 
+1

doh!私は問題を複雑にしました。私の事を簡素化してくれてありがとう。 – liltitus27

1

ソースIDだけが必要な場合は、サブクエリが必要です。しかし、一致する値の数を数えたいとします。条件付きの集約の必要は

HAVING SUM(cand_source = 'mcp'::int) > 1 
+0

私のHAVINGカウント(cand_source = 'mcp')> 1 'と同じではありませんか? – liltitus27

+1

@ liltitus27。 。 。いいえ、あなたのカウントは 'count(cand_source)'と同じです。 'count()'は非 'NULL'値の数を数えるので、比較は無関係です。 –

関連する問題