2017-09-29 23 views
0
Table with repeating data in each column 
| userid | code | date | 
|3   | YYYYYY | 2017-09-20 | 
|3   | YYYYYY | 2017-09-21 | 
|3   | YYYYYY | 2017-09-22 | 
|1   | XXXXXX | 2017-09-22 | 
|1   | XXXXXX | 2017-09-23 | 
|3   | XXXXXX | 2017-09-23 | 
|3   | XXXXXX | 2017-09-23 | 
|2   | ZZZZZZ | 2017-09-23 | 
|3   | ZZZZZZ | 2017-09-23 | 
|1   | ZZZZZZ | 2017-09-24 | 

このコードでMAX(日付)を取得し、このMAX(日付)と 'code'の 'userid'を取得する必要があります。グループは「コード」で表示されます。SQL:他の繰り返し値に基づいた繰り返し値の正確な最大値を選択

SELECT 
t1.userid, 
t1.code, 
t1.date 
FROM codes AS t1 

INNER JOIN (
      SELECT 
       userid, 
       code, 
       MAX(date) as maxdate 
      FROM codes 
      GROUP BY code 
      ) AS t2 
ON (t1.code = t2.code AND t1.date = t2.maxdate) 
ORDER BY date 

ただし、MAX(日付)の値はユーザーIDに基づいている必要があります。

コードにユーザー1と2と3がある場合、最大日付はユーザー3のコードに基づいている必要があります。

コードにユーザー2と3がある場合、最大日付はユーザー3コードに基づいている必要があります。

コードにユーザー1と2がある場合、最大日付はユーザー2のコードに基づいている必要があります。

コードにユーザー3がある場合、最大日付はユーザー3コードに基づいている必要があります。

コードにユーザー2がある場合、最大日付はユーザー2のコードに基づいている必要があります。

コードにユーザー1がある場合、最大日付はユーザー1のコードに基づいている必要があります。

応答が含まれていshuld:(各コードの1行目)「コード」によってgpoupと「ユーザID」の値に基づいてコード、ユーザーID、およびMAX(日付)

この選択を追加する方法は? 任意の助けてくれてありがとう) SQL Fiddle

+0

使用しているデータベースで質問にタグを付けます。 –

答えて

0
SELECT 
    t1.userid, 
    t1.code, 
    t1.date 
    -- SOME OTHER ROWS FROM TABLE 
    FROM 
     codes AS t1 
     -- JOIN TABLE WITH SEARСH ROWS 
     INNER JOIN (
     -- BEGIN SELECT MAX LOGIC 
     SELECT 
      code, 
      CASE WHEN max3date IS NOT NULL THEN max3date WHEN max2date IS NOT NULL THEN max2date ELSE max1date END AS maxdate 
     FROM 
      (
      -- BEGIN SELECT MAX FOR EACH GROUP 
      SELECT 
       all1.code, 
       u3.max3date, 
       u2.max2date, 
       u1.max1date 
      FROM 
       codes AS all1 
       LEFT JOIN (
       SELECT 
        code, 
        MAX(date) AS max3date 
       FROM 
        codes 
       WHERE userid LIKE '3%' 
       GROUP BY 
        code 
      ) AS u3 ON (all1.code = u3.code) 
       LEFT JOIN (
       SELECT 
        code, 
        MAX(date) AS max2date 
       FROM 
        codes 
       WHERE userid LIKE '2%' 
       GROUP BY 
        code 
      ) AS u2 ON (all1.code = u2.code) 
       LEFT JOIN (
       SELECT 
        code, 
        MAX(date) AS max1date 
       FROM 
        codes 
       WHERE userid LIKE '1%' 
       GROUP BY 
        code 
      ) AS u1 ON (all1.code = u1.code) 
      GROUP BY 
       code 
     ) t3 
    ) AS t2 ON (
     t1.code = t2.code 
     AND t1.date = t2.maxdate 
    ) 
    ORDER BY 
     t1.date 

24M行でうまく動作します。日付(時間)は一意でなければなりません。 SQL Fiddle

1

使用ANSI標準のウィンドウ関数:

select c.* 
from (select c.*, 
      row_number() over (partition by code 
           order by date desc, userid desc 
           ) as seqnum 
     from c 
    ) c 
where seqnum = 1; 

あなたのSQLフィドルは、ウィンドウ関数をサポートしていませんMySQLを使用しています。そのデータベースでは、次の操作を実行できます。

SELECT c.* 
FROM codes c 
WHERE (c.userid, c.date) = (SELECT c2.userid, c2.date 
          FROM codes c2 
          WHERE c2.code = c.code 
          ORDER BY c2.date DESC, c2.userid DESC 
          LIMIT 1 
          ); 

ここにはSQL Fiddleがあります。

'XXXXXX'の重複は、その最大値がデータ内で複数回発生するため、依然として重複しています。

+0

返信いただきありがとうございます。重複している「XXXXXX」は問題ありません。最後の行に問題があります - (1 - ZZZZZZ - 2017-09-24)。私はuseridでフィルタリングする必要があります。データはユーザー3 - (3 - ZZZZZZ - 2017-09-23)から取得する必要があります。 – DASOFT

関連する問題