使用GROUP BY,SUM,MAX和子查询的MySQL查询

时间:2018-07-11 13:29:33

标签: mysql

我具有以下表结构:

    phoneNumberPage_phoneEdtTxt.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.toString().length() < 11) {
                enableDisableBtn(0.3f, false);
            } else {
                hideKeyboard(activity);
                enableDisableBtn(1.0f, true);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {
            if (s.toString().trim().length()==1){
                if (!s.equals("0")){
                    Toast.makeText(context, "NOOOOOO", Toast.LENGTH_SHORT).show();
                }
            }
        }
    });
}

我需要一个查询,其中包含“ Id”,“ Num1”之和,“ Num2”之和,“ Num3”的最大值以及与“ Num3”的最大值相关的“类型”。 因此,所需的输出是:

Id  Num1  Num2  Type  Num3
1    2     2     1     4
1    3     1     2     5
1    1     1     3     2
2    2     1     1     3
2    0     1     2     2
2    4     3     3     6

没有这个相关的“类型”,下面的查询可以正常工作:

Id  Sum(Num1)  Sum(Num2)  type  Max(Num3)
1       6          4       2       5   
2       6          4       3       6

我尝试了子查询的不同方法,但是还不能使它工作。

1 个答案:

答案 0 :(得分:2)

您的问题有点像每个组的最大值问题。在这种情况下,我们可以使用子查询为每个Num3查找最大Id值。但是,在同一子查询中,我们还计算总和。

SELECT
    t1.Id,
    t2.s1,
    t2.s2,
    t1.Type,
    t1.Num3
FROM yourTable t1
INNER JOIN
(
    SELECT Id, SUM(Num1) AS s1, SUM(Num2) AS s2, MAX(Num3) AS m3
    FROM yourTable
    GROUP BY Id
) t2
    ON t1.Id = t2.Id AND t1.Num3 = t2.m3;

作为MySQL 8+的入门技巧,为了抵御恶魔,我们还可以使用分析函数编写查询:

SELECT Id, s1, s2, Type, Num3
FROM
(
    SELECT
        Id,
        SUM(Num1) OVER (PARTITION BY Id) s1,
        SUM(Num2) OVER (PARTITION BY Id) s2,
        Type,
        Num3,
        MAX(Num3) OVER (PARTITION BY Id) m3
    FROM yourTable
) t
WHERE Num3 = m3;