2017-09-06 8 views
0

私は以下のサンプルのようなテーブルを持っています。私は、ステータス0を持つすべてのユーザーの行を取得しようとしているとがある場合、重複するユーザーIDは、そのユーザーSQL重複IDを持つ行のうち最大(日付)を選択

TableAの

+----+--------+-------------+--------+ 
| Id | UserId | CreatedDate | Status | 
+----+--------+-------------+--------+ 
| 1 | a234 | 09/02/2017 |  0 | 
| 2 | a234 | 09/03/2017 |  0 | 
| 3 | a234 | 09/06/2017 |  1 | 
| 4 | a143 | 08/25/2017 |  0 | 
+----+--------+-------------+--------+ 

予想される出力のために最大(CreatedDateに)で行を取得します

+----+--------+-------------+--------+ 
| Id | UserId | CreatedDate | Status | 
+----+--------+-------------+--------+ 
| 2 | a234 | 09/03/2017 |  0 | 
| 4 | a143 | 08/25/2017 |  0 | 
+----+--------+-------------+--------+ 

SQLクエリ

SELECT d.Id, d.UserId,d.CreatedDate,d.Status FROM 
(
    SELECT Id, Max(CreatedDate) as MaxDate 
    FROM TableA 
    GROUP BY Id 
    HAVING Count(*)>1 
) r 
INNER JOIN TableA d 
ON d.Id=r.Id AND d.CreatedDate=r.MaxDate AND Status=0 

しかし、私は条件が例えばシーケンスのようであるべき間違っていると思う:

第一条件ステータス= 0

第二の条件の場合、重複ユーザーIDは、マックス(CreatedDateに)他のCreatedDateに

を取る存在

+0

互換性のないデータベースタグを削除しました。実際に使用しているデータのみにタグを付けてください。 –

答えて

3

を使用している場合があります: - 、

SELECT d.Id, d.UserId,d.CreatedDate,d.Status FROM 
(
    SELECT UserId, Max(CreatedDate) as MaxDate 
    FROM TableA 
    WHERE Status = 0 
    GROUP BY UserId 
) r 
INNER JOIN TableA d 
ON d.UserId=r.UserId AND d.CreatedDate=r.MaxDate AND Status=0 

あなたGROUP BY、これが機能するためにUserIdになるために必要なJOINとフィルタを移動しましたStatus=0を派生テーブル/副問合せに追加します。

+0

うわー!それは働いた...あなたは正しい、私はIDをUserIdの代わりに使用していた。ありがとう – shockwave

0

WHERE

SELECT d.Id, d.UserId, d.CreatedDate,d.Status 
FROM TableA d 
WHERE d.Status = 0 and d.CreatedDate = 
     (
      SELECT MAX(x.CreatedDate) 
      FROM TableA x 
      WHERE x.Status = 0 AND x.UserId = d.UserId 
    ) 
0でサブクエリを使用して解決策があります

別の解決策はこれを試してみてくださいNOT EXISTS

SELECT d.Id, d.UserId, d.CreatedDate,d.Status 
FROM TableA d 
WHERE d.Status = 0 and NOT EXISTS 
     (
      SELECT MAX(x.CreatedDate) 
      FROM TableA x 
      WHERE x.Status = 0 AND x.UserId = d.UserId AND 
        x.CreatedDate > d.CreatedDate 
    ) 

またはALL

SELECT d.Id, d.UserId, d.CreatedDate,d.Status 
FROM TableA d 
WHERE d.Status = 0 and d.CreatedDate >= 
     ALL(
      SELECT x.CreatedDate 
      FROM TableA x 
      WHERE x.Status = 0 AND x.UserId = d.UserId 
    ) 
1
select 
     ID 
     , UserID 
     , CreatedDate 
     , [Status] 
    from TableA A 
    inner join (
     select 
      max(CreatedDated) [MaxDate] 
      , UserID 
      , [Status] 
     from TableA 
     where [Status] = 0 
     group by UserID, [Status] 
     ) B on A.UserID = B.UserID and A.CreatedDate = B.MaxDate and A.[Status] = B.[Status] 

私はあなたが期待していなかった結果を得るた理由は、あなたの「持つCOUNT(*)> 1」だけ重複を返しますだったと思います。

0

以下のSQLがより効率的でエレガントになると思います。

SELECT Id, UserId, CreatedDate, Status, 
MAX (CreatedDate) OVER (PARTITION BY USerId) AS max_CreatedDate 
FROM TableA 
WHERE Status = 0; 

あなたがうまくいくかどうか教えてください!

Ted。

+0

これは私に重複したUserIdの行を与え、Max(CreatedDate)は有効ではありません – shockwave

+0

私は見る!私はあなたの意図を誤解しました、私はStatus = 0のすべてのIDを返すと思っていました。 –

関連する問題