【问题标题】:SQL request with "Group by" and "max" and "join"?带有“Group by”、“max”和“join”的 SQL 请求?
【发布时间】: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。这将比当前的解决方案更快、更清晰。

标签: sql mysql group-by inner-join


【解决方案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:我的错!现已修复。
  • 非常感谢,它现在可以工作了!对我来说还是有点复杂,我会仔细研究一下:)
猜你喜欢
  • 2010-11-20
  • 1970-01-01
  • 2014-12-24
  • 2014-04-20
  • 1970-01-01
  • 2016-04-11
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多