我有一张桌子:
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')
答案 0 :(得分:3)
添加此项是因为其他答案虽然准确,但不详细。
您要在此处执行的操作是使用SQL的grouping
和aggregation
功能。
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