2016-09-26 5 views
1

Я пытаюсь выбрать только определенные строки, содержащие определенное свойство. Вот пример данных, я работаю с:Выделить группированные строки, имеющие определенное свойство

 
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 

То, что я хочу сделать, это выбрать только src_id s, имеющие по меньшей мере, один cand_source сравнявшись 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 

Это, однако, продолжает давать мне обратно кластеры src_id с, которые не имеют cand_source сек сравнявшись mcp.


Было указано, что я просто чрезмерное. Вот решение:

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

Если вы просто хотите src_id, который имеет MCP то прямой запрос с пунктом WHERE достаточно никакой потребности в условную агрегации или что-нибудь.

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

Если вы хотите, чтобы все записи для каждого src_id, который имеет по крайней мере 1 cand_source вы можете присоединиться, что обратно к столу, чтобы получить все записи.

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 = ? 

Или вы можете использовать Common Table Expression с помощью функций awesome window для этого.

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

Если вам нужны только идентификаторы источника, тогда ваш подзапрос - это все, что вам нужно. Но вы хотите подсчитать количество совпадающих значений. Здесь не многословен логик:

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 

Более лаконичная версия:

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

не то же самое, что мой счетчик HAVING (cand_source = 'mcp')> 1'? – liltitus27

+1

@ liltitus27. , , Нет. Ваш счет совпадает с «count (cand_source)». Сравнение не имеет значения, поскольку 'count()' подсчитывает количество значений, отличных от 'NULL'. –

Смежные вопросы