【问题标题】:sqlite select minimum function value of grouped resultsqlite 选择分组结果的最小函数值
【发布时间】:2011-05-18 00:44:15
【问题描述】:

我有一张桌子,上面有连锁餐厅的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()

【问题讨论】:

    标签: sql function sqlite group-by min


    【解决方案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 *)。

    【讨论】:

      【解决方案2】:

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

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

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

      首先,在使用聚合函数时避免使用*,列出查询中需要的列。

      也许向我们提供示例数据可能会帮助我们找到解决问题的方法。

      【讨论】:

        【解决方案3】:

        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 
        

        希望这对其他人有帮助

        【讨论】:

          猜你喜欢
          • 2015-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-17
          • 2021-06-08
          • 2016-03-22
          • 1970-01-01
          相关资源
          最近更新 更多