根据一列中相同值的序列对一列中的相同值进行过滤

时间:2020-01-23 14:57:26

标签: sql

我有此数据(请参见所附屏幕截图)。我想考虑所有的约会系列 意甲中的约会具有完全相同的visit_motive_id。我的意思是,对于约会约会ID = 337438750,我只想保留一个visit_motive_id,但要记住,有时对于不同的约会约会ID,您可以具有相同的visit_motive_id。

这是我的数据的样子

+--------------------+-----------------+
| appointment_set_id | visit_motive_id |
+--------------------+-----------------+
|          336926466 |          388468 |
|          336926466 |          388468 |
|          337145347 |           69664 |
|          337438750 |          484259 |
|          337438750 |          484259 |
|          337438750 |          484261 |
|          337438750 |          484262 |
|          337652969 |            1725 |
|          337652969 |            1725 |
|          337652969 |            1726 |
|          337652969 |            1727 |
|          337652969 |            1725 |
|          337652969 |            1725 |
+--------------------+-----------------+

这就是我需要的,一个单一的visit_motive_id可以作为一个约会集ID。

+--------------------+-----------------+
| appointment_set_id | visit_motive_id |
+--------------------+-----------------+
|          336926466 |          388468 |
|          336926466 |          388468 |
|          337145347 |           69664 |
|          337438750 |          484259 |
|          337438750 |          484259 |
|          337652969 |            1725 |
|          337652969 |            1725 |
|          337652969 |            1725 |
|          337652969 |            1725 |
+--------------------+-----------------+

感谢您的帮助

3 个答案:

答案 0 :(得分:0)

您可以使用HAVING过滤掉多次访问的约会。例如:

select * 
from t
where appointment_set_id is null 
   or appointment_set_id in (
      select appointment_set_id
      from t
      group by appointment_set_id
      having min(visit_motive_id) <> max(visit_motive_id)
    )

答案 1 :(得分:0)

您可以进行聚合:

select appointment_set_id, visit_motive_id
from table t
group by appointment_set_id, visit_motive_id
having count(*) = 1;

答案 2 :(得分:0)

我怀疑您想要最频繁的“动机”。这在技术上称为“模式”。聚合和窗口函数可以做到这一点:

select appointment_set_id, visit_motive_id
from (select appointment_set_id, visit_motive_id, count(*) as cnt,
             row_number() over (partition by appointment_set_id order by count(*) desc) as seqnum
      from t
      group by appointment_set_id, visit_motive_id
     ) t
where seqnum = 1;

这不会返回原始行。但这实际上似乎没有用。当然,您可以使用join或类似的机制来获取原始行。