0
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行に日付列を追加することだけです。

4

2 に答える 2

0

おそらくこれに単純化できます:

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

詳細は、不足している情報によって異なります。

詳細はこちら。

于 2012-11-16T14:28:59.227 に答える
0

あなたの説明に基づいて、サブクエリで最初にdistinctを使用するように促した一部のsubscriber_msisdn値に複数のcreated_datetime値があるのは当然のことです。サブクエリを元のテーブルに結合することで、これを無効にしています。クエリをよりクリーンに記述する方法は次のとおりです。

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'

これにより、wai テーブルに基づく基準を満たす war テーブルからの行のみが返されます。application_item_id パラメーターに関係なく、created_datetime パラメーターを満たす war テーブルからすべての行を返す場合を除き、外部結合は使用しないでください。

これは、あなたのテーブルについて私が持っている限られた情報と、あなたが達成しようとしていると私が想定していることに基づいた私の最善の推測です. これで目的が達成できない場合は、提供できる追加情報に基づいて、引き続き他のアイデアを提供します。これがうまくいくことを願っています。

于 2012-11-16T14:21:49.463 に答える