【问题标题】:select distinct from 2 columns but only 1 is duplicate从 2 列中选择不同但只有 1 列是重复的
【发布时间】:2012-11-05 06:08:54
【问题描述】:
select a.subscriber_msisdn, war.created_datetime from 
(
select distinct subscriber_msisdn from wiz_application_response 
where application_item_id in 
(select id from wiz_application_item  where application_id=155)
and created_datetime between '2012-10-07 00:00' and '2012-11-15 00:00:54'
) a
 left outer join wiz_application_response war on (war.subscriber_msisdn=a.subscriber_msisdn)

子选择返回 11 行,但加入时返回 18(有重复项)。此查询的目标只是将日期列添加到子选择的 11 行中。

【问题讨论】:

  • 我没有看到表定义、示例数据或 PostgreSQL 版本。

标签: postgresql join duplicates distinct subquery


【解决方案1】:

根据您的描述,有理由认为某些subscriber_msisdn 值有多个 created_datetime 值,这促使您开始在子查询中使用 distinct。通过将子查询加入到原始表中,您正在打败它。编写查询的更简洁的方法是:

SELECT
    war.subscriber_msisdn
  , war.created_datetime
FROM
  wiz_application_response war
  LEFT JOIN wiz_application_item  wai
    ON war.application_item_id = wai.id
    AND wai.application_id = 155
WHERE
  war.created_datetime BETWEEN '2012-10-07 00:00' AND '2012-11-15 00:00:54'

这应该只返回 war 表中满足基于 wai 表的条件的行。它不应该是外连接,除非你想从 war 表中返回满足 created_datetime 参数的所有行,而不考虑 application_item_id 参数。

根据我对您的桌子的有限信息以及我假设您要完成的工作,这是我的最佳猜测。如果这不能满足您的需求,我将继续根据您可以提供的其他信息提供其他想法。希望这行得通。

【讨论】:

    【解决方案2】:

    很可能可以简化为:

    SELECT DISTINCT ON (1)
           r.subscriber_msisdn, r.created_datetime
    FROM   wiz_application_item i
    JOIN   wiz_application_response r ON r.application_item_id = i.id
    WHERE  i.application_id = 155
    AND    i.created_datetime BETWEEN '2012-10-07 00:00' AND '2012-11-15 00:00:54'
    ORDER  BY 1, 2 DESC  -- to pick the latest created_datetime
    

    细节取决于缺失的信息。

    More explanation here.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2015-11-17
      • 1970-01-01
      • 2014-12-11
      相关资源
      最近更新 更多