带有“Group by”、“max”和“join”的 SQL 请求?

Posted

技术标签:

【中文标题】带有“Group by”、“max”和“join”的 SQL 请求?【英文标题】:SQL request with "Group by" and "max" and "join"? 【发布时间】:2011-01-22 17:21:57 【问题描述】:

这是我的数据示例:

CLIENT_ATTRIBUT:

ID_CLIENT | DATE_CLIENT | ATTRIBUT
----------+-------------+---------
000000001 | 2010:03:01  | 0000010
----------+-------------+---------
000000001 | 2010:02:16  | 0000010
----------+-------------+---------
000000001 | 2010:03:04  | 0000011
----------+-------------+---------
000000002 | 2010:03:01  | 0001000
----------+-------------+---------

客户:

ID_CLIENT | NOM_MARITAL |
----------+-------------+
000000001 | PANTROMANI  | 
----------+-------------+
000000002 | ELLOUQUIER  |
----------+-------------+

我想为“CLIENT_ATTRIBUT”表中的每个 ID_CLIENT 获取: ID_CLIENT、max(DATE_CLIENT) 及其对应的“ATTRIBUT”和“NOM_MARITAL”

所以在上面的例子中:

ID_CLIENT | DATE_CLIENT | ATTRIBUT | NOM_MARITAL |
----------+-------------+----------+-------------+
000000001 | 2010:03:04  | 0000011  | PANTROMANI  |
----------+-------------+----------+-------------+
000000002 | 2010:03:01  | 0001000  | ELLOUQUIER  |

(我正在使用 mysql,但我想它与任何数据库系统都不应该如此不同)

【问题讨论】:

闻起来像作业,已经在这个网站上回答了无数次。 请参阅this similar question 以获得答案。 不幸的是这是 MySQL,在 postgresql 中你可以SELECT DISTINCT ON( id_client ) date_client, attribut, non_marital FROM client_attribut JOIN client USING ( id_client ) ORDER BY date_client DESC。这将比当前的解决方案更快、更清晰。 【参考方案1】:

您应该能够按如下方式使用子查询:

SELECT 
    client.id_client,
    sub_query.date_client,
    client_attribut.attribut,
    client.nom_marital
FROM
    client
INNER JOIN
    (SELECT 
         client_attribut.id_client, 
         MAX(client_attribut.date_client) as date_client
     FROM 
         client_attribut
     GROUP BY 
         client_attribut.id_client)
     AS sub_query ON (sub_query.id_client = client.id_client)
INNER JOIN
    client_attribut ON (client_attribut.id_client = sub_query.id_client AND
                        client_attribut.date_client = sub_query.date_client);

【讨论】:

看起来这个解决方案没有给出正确的“ATTRIBUT”值:在上面的例子中,对于 ID_CLIENT =“000000001”,它会给出“0000010”而不是“0000011” @dangolive:我的错!现已修复。 非常感谢,它现在可以工作了!对我来说还是有点复杂,我会仔细研究一下:)

以上是关于带有“Group by”、“max”和“join”的 SQL 请求?的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 SUM 和 GROUP BY 的完整 JOIN 避免重复条目

带有 LEFT JOIN 和 GROUP BY 的 COUNT(*) 在 MySQL 中包含 NULL

EF Linq to Sql 多表left join查询并对结果group by分组之后进行count,max等处理

带有 MIN 和 MAX 的 GROUP BY - 属于解决方案的日期范围

SQL Server:带有 GROUP BY 子句的 OUTER JOIN 不会返回所有可能的组合?

带有 WHERE 子句的 GROUP BY 以及 sql 中的 OR 的 LEFT JOIN