【问题标题】:Making statistics on database columns through Cursor?通过 Cursor 对数据库列进行统计?
【发布时间】:2015-06-02 10:46:11
【问题描述】:

我有一个Cursor 查询数据库。我有兴趣从列中获取所有数字,并对它们进行一些简单的统计(例如,平均值、标准差等等),这些统计将显示给用户。

我想念这里的整个模式。我是否应该将所有值存储在 int[] 数组中,然后进行操作?我想到的唯一方法是:

int entries = cursor.getCount();
int[] array = new int[entries];

for (int i = 0; i < entries; i++) {
    cursor.moveToPosition(i);
    array[i] = cursor.getInt(...);
}

此时我被卡住了,因为我不知道如何在int[] 上执行一些操作(甚至是简单的意思),可能没有第二个for

作为第二次机会,我可以这样做:

int entries = cursor.getCount();
float mean = 0;

for (int i = 0; i < entries; i++) {
    cursor.moveToPosition(i);
    int newValue = cursor.getInt(...);
    mean = mean + newValue/entries;
}
return mean;

但它对我来说一直看起来很糟糕。 此外,如果我需要计算更复杂的统计数据,情况可能会变得更糟。可以以某种方式避免这种 for 循环吗?还有更正确的方法吗?

【问题讨论】:

  • 您可能会在查询时获得值。 Sqlite 具有AVG 函数。您应该检查它是否在 android 中也可用(应该)。
  • @Blackbelt 谢谢,很高兴知道。但是,我肯定需要计算的不仅仅是平均值,如果 these 都是可用的函数,我还没有真正完成。我只是想知道for + moveToPosition() 是否是标准方式。
  • 你列出了两个:平均值和标准差。意思很简单,你已经有了这个功能。要计算标准偏差,可以使用 sum、avg 和 count,来计算平方根的自变量,
  • @Blackbelt 可能是我对 SQLite 一无所知,但是如果我需要 (value[i]-average)^2 的总和,我怎么能在列值上使用SUM( columnName )?像SUM((columnName - AVG(columnName))^2) 这样的东西有用吗?谢谢。
  • 它稍微复杂一点,但你在正确的轨道上

标签: java android statistics android-cursor


【解决方案1】:

你可以使用 sqlite 的函数AVG 来计算平均值。要计算standard deviation,可以使用函数SUM,结合AVG。正如您在评论中正确指出的那样

SELECT SUM((column - subquery.avg) * (column - subquery.avg)) / (COUNT(column)-1) 
   FROM table, 
    (SELECT AVG(column) AS avg FROM table) AS subquery

应该这样做

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2011-03-17
    相关资源
    最近更新 更多