从具有不同名称的表中获取值的AVG()

时间:2015-05-20 05:44:09

标签: mysql sql sql-server oracle

我有一张桌子:

CREATE TABLE data
(
    value integer,
    name varchar(100)
)

在我的表格中,name的重复值可能与value的值不同。现在,我想从表DISTINCT获取name avg()value data

我可以获得DISTINCT name的值,但无法获得avg()的{​​{1}}。

现在,通过以下查询,我获得所有数据的value

avg()

我知道这是不正确的,但我是SQL新手。对于select floor(avg(value)) from data 的{​​{1}}值,我希望select floor(avg(value))distinct

数据:

name

输出:

insert into data values(10, 'mnciitbhu')
insert into data values(20, 'mnciitbhu')
insert into data values(40, 'mafiya69')
insert into data values(20, 'mafiya69')
insert into data values(0, 'mafiya69')

3 个答案:

答案 0 :(得分:3)

添加此项是因为其他答案虽然准确,但不详细。

您要在此处执行的操作是使用SQL的groupingaggregation功能。

grouping特定字段的结果会将您的结果集划分为离散的部分,您可以使用aggregate函数对其进行操作,以获得每组的平均值,总和,计数等。

有关汇总功能的完整列表以及有关group by的其他杂项信息,您可以阅读12.16.1 GROUP BY (Aggregate) Functions

在您的实例中,由于您需要每个名称的平均值,因此您需要group by name。这将提供以下查询:

select name, avg(value)
  from `data`
  group by name;       -- this is the important line

此查询将计算表中每组名称的value的平均值,每组返回一行。

使用group by时,一个非常重要的考虑因素是select中包含的所有字段必须包含在group by子句中,或者在聚合函数中使用。如果您引用未涵盖此字段的字段,您可能会得到不希望的不确定结果。

来自手册12.16.3 MySQL Handling of GROUP BY

  

MySQL扩展了GROUP BY的使用,以便选择列表可以引用   未在GROUP BY子句中命名的非聚合列。这意味着   前面的查询在MySQL中是合法的。您可以使用此功能   通过避免不必要的列排序来获得更好的性能   分组。但是,这主要适用于每个中的所有值   GROUP BY中未命名的非聚合列对于每个列都是相同的   组。服务器可以自由选择每个组中的任何值,所以   除非它们相同,否则所选择的值是不确定的。

该段的重要性不容小觑。很容易误解这是如何工作的,得到一个似乎能给出所需结果的查询,但偶尔会给出不正确/不需要的数据。

答案 1 :(得分:0)

使用此代码:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<强>输出:

    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 
            0, 
            0,
            new MyLocationListener()
    );

    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);
    criteria.setCostAllowed(true);
    criteria.setPowerRequirement(Criteria.POWER_LOW);

    String provider = locationManager.getBestProvider(criteria, true);

    Location location = locationManager.getLastKnownLocation(provider);
    System.out.println("location: " + location);

答案 2 :(得分:-1)

试试这个

select name,avg(value) from data group by name