sqlite选择分组结果的最小函数值

时间:2010-11-30 17:38:54

标签: sql function sqlite group-by min

我有一张餐馆连锁店的gps位置的表格,并希望在一定范围内返回离点(A)最近的餐馆的地址

SELECT *
    , MIN(distance($lat, $lon, lat, lon)) as miles 
FROM all_restaurants 
WHERE lat between $lat1 and $lat2 
    AND lon between $lon1 and $lon2 
    AND miles < $miles 
GROUP BY restaurant_id 
ORDER BY miles ASC
    , company_name ASC 
LIMIT 500

返回错误

  

滥用聚合:MIN()

3 个答案:

答案 0 :(得分:1)

我认为您的问题是您只按restaurant_id进行分组。当您使用聚合函数MIN, MAX, SUM, AVG等时,您需要在SELECT语句中包含不在任何聚合函数中的每一列。在这种情况下,您有两个选项,可以在SELECT中仅将restaurant_id放在以下位置:

SELECT restaurant_id 
        , MIN(distance($lat, $lon, lat, lon)) as miles 
    FROM all_restaurants 
    WHERE lat between $lat1 and $lat2 
        AND lon between $lon1 and $lon2 
        AND miles < $miles 
    GROUP BY restaurant_id 
    ORDER BY miles ASC
        , company_name ASC 
    LIMIT 500

或者您将“*”中包含的所有其他列放在分组上(因为您无法使用GROUP BY *)。

答案 1 :(得分:0)

我打赌你正在调用distance($lat, $lon, lat, lon)的函数,不是吗?

您是否尝试在$latlat之间使用简单的减法,并使用MIN函数返回最小值?

MIN的目的是用于表字段或一些基本操作,例如减法,我想。这可能是遇到错误的原因。

最重要的是,避免在使用聚合函数时使用*,列出查询中所需的列。

或许向我们提供样本数据可能有助于我们找到解决方法。

答案 2 :(得分:0)

Lamak有点不对,但这就是我最终做的事情

SELECT *, distance('+lat+','+lon+', lat, lon) as minmiles
FROM all_restaurants 
WHERE restaurant_id || minmiles IN 
( 
    SELECT restaurant_id || MIN(miles) as fewmiles 
    FROM ( 
        SELECT restaurant_id, distance('+lat+','+lon+', lat, lon) as miles 
        FROM restaurant_master_combined 
        WHERE lat BETWEEN $lat AND $lat2 AND lon BETWEEN $lon1 AND $lon2 AND miles < $miles
    ) 
    GROUP BY restaurant_id 
)
ORDER BY ROUND(minmiles) ASC, company_name ASC 

希望这有助于其他人