首页 > 解决方案 > 选择与具有特定值的其他行关联的行

问题描述

我有关于电话的事件形式的数据,看起来像:

|event_id|call_id|event_type      |service|...
|--------|-------|----------------|-------|---
|       1|      1|Call Started    |null   |
|       2|      1|Recorded Message|null   |
|       3|      1|Call at IVR     |null   |
|       4|      1|Agent Ringing   |Sales  |
|       5|      1|Agent Answers   |Sales  |
|       6|      2|Call Started    |null   |
|       7|      2|Recorded Message|null   |
|       8|      2|Call at IVR     |null   |
|       9|      1|Disconnected    |null   |
|      10|      1|Call Ended      |null   |
|      11|      3|Call Started    |null   |
|      12|      3|Recorded Message|null   |
|      13|      2|Agent Ringing   |Support|
|      14|      3|Agent Ringing   |Sales  |
|      15|      2|Agent Answers   |Support|
|      16|      3|Agent Answers   |Sales  |
|      17|      3|Call Hold       |null   |
|      18|      2|Disconnected    |null   |
|      19|      2|Call Ended      |null   |
|      20|      3|Call Retrieved  |Sales  |
|      21|      3|Disconnected    |null   |
|      22|      3|Call Ended      |null   |

我只想选择那些与调用Sales. 如您所见,只有某些类型的事件在service列中包含数据,这是我需要过滤的列。由于处理方式的不同,调用在它们包含的事件数量上也不一致。

我一直在通过加载所有事件然后使用GroupBy()on过滤应用程序中的调用call_id,最后通过选择任何具有serviceequaling的事件来过滤这些组Sales

由于在实际数据中存在大量我不想要的调用,因此在数据库中过滤它会更有效。我该怎么做?

就像是

SELECT event_id
FROM events
GROUP BY call_id
HAVING (SELECT COUNT(*) FROM ***this_group*** WHERE service='Sales') > 0

预期的输出应该是

|event_id|
|--------|
|       1|
|       2|
|       3|
|       4|
|       5|
|       9|
|      10|
|      11|
|      12|
|      13|
|      16|
|      17|
|      20|
|      21|
|      22|

标签: mysqlsql

解决方案


  • 在子查询中,确定call_id至少有一行包含service = 'SALES'.
  • 只需在外部查询中使用此子查询结果来匹配call_id并获取所有event_id

方法 1:使用派生表

SELECT e1.event_id
FROM events AS e1
JOIN (SELECT DISTINCT e2.call_id
      FROM events AS e2 
      WHERE e2.service = 'SALES') AS dt 
  ON dt.call_id = e1.call_id 

方法 2:使用WHERE .. IN(..)

SELECT e2.event_id
FROM events AS e2 
WHERE e2.call_id IN (SELECT DISTINCT e1.call_id
                     FROM events AS e1
                     WHERE e1.service = 'SALES')

推荐阅读