提高选择查询的性能和可读性

时间:2019-10-11 12:08:25

标签: mysql sql

  

我有下表LOANACCOUNT。我想确定每种帐户类型余额最多的帐户(IDCREATIONDATETYPE)。

贷款帐户表:

    ID  CREATIONDATE        TYPE        BALANCE
    1   2019-10-10 16:44:42 FIXED       390.92951
    2   2019-10-10 16:44:42 REVOLVING   81.68381
    3   2019-10-10 16:44:42 DYNAMIC     818.80966
    4   2019-10-10 16:44:42 FIXED       166.83337
    5   2019-10-10 16:44:42 REVOLVING   888.93255
    6   2019-10-10 16:44:42 DYNAMIC     422.1623
    7   2019-10-10 16:44:42 FIXED       165
    8   2019-10-10 16:44:42 REVOLVING   122.37553
    9   2019-10-10 16:44:42 DYNAMIC     370.60668
    10  2019-10-10 16:44:42 FIXED       1101.10781
    11  2019-10-10 16:44:42 REVOLVING   387.35689
    12  2019-10-10 16:44:42 DYNAMIC     1.029
    13  2019-10-10 16:44:42 FIXED       420.85499
    14  2019-10-10 16:44:42 REVOLVING   0
    15  2019-10-10 16:44:42 DYNAMIC     233.53848

预期输出:

    ID  CREATIONDATE        TYPE
    10  2019-10-10 16:44:42 FIXED
    3   2019-10-10 16:44:42 DYNAMIC
    5   2019-10-10 16:44:42 REVOLVING

我的尝试

(select id, creationdate, type
 from LOANACCOUNT
 where type = 'FIXED'
 order by balance desc
 limit 1)
union
(select id, creationdate, type
 from LOANACCOUNT
 where type = 'DYNAMIC'
 order by balance desc
 limit 1)
union
(select id, creationdate, type
 from LOANACCOUNT
 where type = 'REVOLVING'
 order by balance desc
 limit 1)

我的查询之所以有效,是因为目前我只有这3种类型:FIXED,REVOLVING,DYNAMIC。但是,如果我添加了包含另一种类型的新行,则必须对其查询进行编辑以使其起作用。

2 个答案:

答案 0 :(得分:1)

此sql语句

SELECT 
  ID,
  CREATIONDATE,
  la.TYPE
FROM 
  `loan account` la
  INNER JOIN
   (SELECT
     TYPE, MAX(BALANCE) BALANCE
    FROM 
     `loan account` 
    GROUP BY TYPE) la1
    on la.TYPE = la1.TYPE and
       la.BALANCE = la1.BALANCE
GROUP BY la.TYPE,CREATIONDATE,ID;

给你:

ID  CREATIONDATE            TYPE
3   2019-10-10T16:44:42Z    DYNAMIC
10  2019-10-10T16:44:42Z    FIXED
5   2019-10-10T16:44:42Z    REVOLVING

Thx适应了Raymond Nijland 例 http://sqlfiddle.com/#!9/ecab9b/10

答案 1 :(得分:1)

您可以使用MySQL | Recursive CTE (Common Table Expressions)

例如:

;WITH cte AS (
SELECT
`ID`, ROW_NUMBER() OVER (PARTITION BY `TYPE` ORDER BY `BALANCE` DESC) AS RowNum
FROM LOANACCOUNT as t 
)
SELECT c.`ID`,`CREATIONDATE`,`TYPE` FROM LOANACCOUNT as t join cte as c on t.Id=c.Id WHERE c.RowNum=1