如果列值相同,则查找最新行,否则返回具有相同列最大值的行

时间:2020-06-15 08:35:52

标签: mysql

如果某个帐户的state col值相同,那么我需要从下表中获取记录,然后获取date_time值最大的行,否则获取state的最大值< / strong>

state max表示:哪个数字最大(如Desc顺序)state3> state2> state1

表格

-----------------------------------------------------------------------
Id  | account   | Name          | state     | date_time
-----------------------------------------------------------------------
1   | 145552    | Salleh        | state2    | 2020-05-08T20:55:45Z
2   | 145552    | Salleh        | state3    | 2020-05-04T06:50:27Z
3   | 145552    | Salleh        | state1    | 2020-04-01T21:10:32Z
4   | 836001    | Sharifudeen   | state2    | 2020-05-14T01:10:40Z
5   | 836001    | Sharifudeen   | state3    | 2020-05-13T01:10:40Z
6   | 321032    | Amir          | state1    | 2020-05-14T01:10:40Z
7   | 321032    | Amir          | state1    | 2020-05-15T01:10:40Z

上表中的必需结果

-----------------------------------------------------------------------
Id  | account   | Name          | state     | date_time
-----------------------------------------------------------------------
2   | 145552    | Salleh        | state3    | 2020-05-04T06:50:27Z
5   | 836001    | Sharifudeen   | state3    | 2020-05-13T01:10:40Z
7   | 321032    | Amir          | state1    | 2020-05-15T01:10:40Z

我的查询:根据所描述的条件,它没有给我上面期望的结果。

条件: 如果帐户的状态相同,则获取date_time值最大的行,否则获取状态最大的行

SELECT a.*
FROM accounts a
INNER JOIN
    (SELECT account, max(state) as state, MAX(date_time) AS MaxDateTime
    FROM accounts 
    GROUP BY account order by state,date_time desc) acc
ON a.account = acc.account
and a.state = acc.state 
group by a.account

我的查询结果

-----------------------------------------------------------------------
Id  | account   | Name          | state     | date_time
-----------------------------------------------------------------------
2   | 145552    | Salleh        | state3    | 2020-05-04T06:50:27Z
5   | 836001    | Sharifudeen   | state3    | 2020-05-13T01:10:40Z
6   | 321032    | Amir          | state1    | 2020-05-14T01:10:40Z

以上两行正确,但帐户321032的最后一行不正确,应为第7个id行。

请帮助我。 谢谢

1 个答案:

答案 0 :(得分:1)

SELECT t3.*
FROM accounts t3
JOIN ( SELECT account, state, max(t2.date_time) as date_time
       FROM accounts t2
       JOIN ( SELECT account, max(state) as state
              FROM accounts t1
              GROUP BY account
            ) subquery1 USING (account, state)
       GROUP BY t2.account, t2.state
     ) subquery2 USING (account, state, date_time);

fiddle