为什么Max函数返回值为0的行

时间:2018-09-01 21:24:30

标签: sql max where

谁能告诉我为什么下面的查询似乎返回存在百分比值为0的行。

func Write_profit_table(profitWriteChannel chan string, profitType string, req *http.Request) {
    var profitReq profitReq;
    err := json.NewDecoder(req.Body).Decode(&profitReq);
    if err!=nil{
        log.Panic(err)
    }

    NotInDB, _ := Search_userinfo_table(profitReq.Email)

    if NotInDB == false {
        var lastInsertId int
        err2 := db.QueryRow("INSERT INTO profit(email, type, dateArray, amount, interest, compounded, recurring, name, description, profitFrom) 
                VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) returning uid;", 
                profitReq.Email, profitReq.Type, pq.Array(profitReq.DateArray), profitReq.Profit, profitReq.Interest, 
                profitReq.Compounded, profitReq.Recurring, profitReq.Name, profitReq.Description, profitReq.ProfitFrom).Scan(&lastInsertId);
        if err2!=nil{
            log.Panic(err2)
        }
    }

    profitWriteChannel<-"finished writing to profit"
}

我可以在查询中添加'&& percent> 0'以将其过滤掉,但MAX函数应该只过滤每个国家/地区代码的最大百分比?

2 个答案:

答案 0 :(得分:0)

尝试这样修改;

SELECT cl.countrycode, c.name, c.continent, cl.language
FROM country c
JOIN countrylanguage cl ON cl.countrycode = c.code
WHERE Percentage = (SELECT MAX(Percentage) FROM countrylanguage cl2 where cl2.countrycode=cl.countrycode)

答案 1 :(得分:0)

这是您的查询:

SELECT cl.countrycode, c.name, c.continent, cl.language
FROM country c JOIN
     countrylanguage cl
     ON cl.countrycode = c.code
WHERE Percentage = ANY (SELECT MAX(Percentage)
                        FROM countrylanguage
                        GROUP BY countrycode
                       );

子查询返回所有百分比,该百分比是任何国家/地区的最大值。在某些国家/地区,0是最大值。您可以独立运行查询以查看此内容。

然后,外部查询会找到与 any 国家/地区的最大值匹配的任何百分比。真的没有道理。

您想要的是每个国家/地区的最大数量。为此,请使用相关子查询:

SELECT cl.countrycode, c.name, c.continent, cl.language
FROM country c JOIN
     countrylanguage cl
     ON cl.countrycode = c.code
WHERE cl.Percentage = (SELECT MAX(cl2.Percentage)
                       FROM countrylanguage cl2
                       WHERE cl2.countrycode = cl.countrycode
                      );

区别在于子查询现在具有WHERE子句,而不是GROUP BY子句,要求国家/地区相同。