从另一个中为每个唯一值检索最多一列

时间:2013-11-06 16:24:15

标签: mysql sql

我尝试了什么,哪些会返回不正确的数据:

SELECT type, pid, MAX(distance) FROM table GROUP BY type

这将从我的数据库中检索每个唯一type和每个distance的相应最大type(总共有26个不同的唯一type值,这将是永远不会改变),但pid值不正确。如何检索正确且对应的pid值?

示例表数据:

pid  | type | distance  | ...
675  | dcj  | 273060192 | ...
743  | mcj  | 273046176 | ...
284  | dcj  | 271592224 | ...
4091 | lj   | 255217488 | ...
743  | lj   | 255170160 | ...
4091 | lj   | 230840928 | ...

应该返回什么:

pid  | type | distance
675  | dcj  | 273060192
743  | mcj  | 273046176
4091 | lj   | 255217488

有关数据的一些值得注意的信息: 每pid个值有多个条目,每个pid值可能有多个条目具有相同的type值。

我是否需要利用PHP来运行两个不同的查询,其中第一个查询通过type获取26个不同的GROUP BY type值,第二个查询执行26个不同的时间(每个唯一{{1通过类似type之类的内容查找每个type的最大值?或者这可以在一个SQL查询中完成吗?

3 个答案:

答案 0 :(得分:2)

此查询提供所需的结果。

SELECT t.type, t.pid, t.distance
FROM table t
INNER JOIN (SELECT type, MAX(distance) as distance FROM table GROUP BY type) as m
ON t.type = m.type and t.distance = m.distance
ORDER BY t.type

对于两个或更多pid具有相同最大距离的(非常可能的)情况,它将返回具有相同最大距离的所有pid。

答案 1 :(得分:1)

您可以执行GROUP BY查询,然后将其加入原始表格以获得正确的pid,如下所示:

SELECT x.type, t.pid, x.max_dist
FROM (
    SELECT type, MAX(distance) as max_dist FROM table GROUP BY type
) as x
JOIN table t ON x.max_dist=t.distance AND x.type=t.type

Demo on sqlfiddle

答案 2 :(得分:0)

使用公用表表达式也可以这样做:

;
WITH    cte
          AS ( SELECT   pid,
                        type,
                        distance,
                        ROW_NUMBER() OVER ( PARTITION BY pid ORDER BY distance DESC ) AS RowNum
               FROM     table_name
             )
    SELECT  pid,
            type,
            distance
    FROM    cte
    WHERE   RowNum = 1