标签: aggregate-functions

有没有更好的方法来计算中位数(不是平均值)

假设我有以下表定义:

CREATE TABLE x (i serial primary key, value integer not null);
Run Code Online (Sandbox Code Playgroud)

我想计算value(不是AVG)的MEDIAN .中位数是在包含相同数量元素的两个子集中划分集合的值.如果元素的数量是偶数,则中位数是最低段中的最大值和最大段的最低值的平均值.(有关详细信息,请参阅维基百科.)

以下是我如何计算MEDIAN,但我想必须有更好的方法:

SELECT AVG(values_around_median) AS median
  FROM (
    SELECT
       DISTINCT(CASE WHEN FIRST_VALUE(above) OVER w2 THEN MIN(value) OVER w3 ELSE MAX(value) OVER w2 END)
        AS values_around_median
      FROM (
        SELECT LAST_VALUE(value) OVER w AS value,
               SUM(COUNT(*)) OVER w > (SELECT count(*)/2 FROM x) AS above
          FROM x
          GROUP BY value
          WINDOW w AS (ORDER BY value)
          ORDER BY value
        ) AS find_if_values_are_above_or_below_median
      WINDOW w2 AS (PARTITION BY …
Run Code Online (Sandbox Code Playgroud)

sql postgresql aggregate-functions

14
推荐指数
3
解决办法
1万
查看次数

SQL:元组比较

在我当前的应用程序中,我需要能够执行此类查询:

SELECT MIN((colA, colB, colC)) 
FROM mytable
WHERE (colA, colB, colC) BETWEEN (200, 'B', 'C') AND (1000, 'E', 'F')
Run Code Online (Sandbox Code Playgroud)

并得到(333, 'B', 'B')这个数据的答案:

+------+------+------+
| colA | colB | colC |
+------+------+------+
|   99 | A    | A    |
|  200 | A    | Z    |
|  200 | B    | B    |
|  333 | B    | B    |
|  333 | C    | D    |
|  333 | C    | E    |
|  333 | D    | …
Run Code Online (Sandbox Code Playgroud)

mysql sql aggregate-functions row-value-expression

14
推荐指数
1
解决办法
1万
查看次数

mysql计算所有行的总和

我有一个有多个行的mysql表,并且在每一行中都有一个名为"value"的字段,字段值因行而异.我想要的是选择所有行并计算所有"值"字段的总和.

任何的想法?

mysql sql database aggregate-functions

14
推荐指数
1
解决办法
6万
查看次数

是否可以在不使用Group By子句的情况下在Select语句中使用Aggregate函数?

到目前为止,我已经编写了Aggregate函数,后跟Group By子句,以查找基于SUM,AVG和其他Aggregate函数的值.我在Group By子句中有点混乱.当我们使用Aggregate函数时,我需要在Group By子句中指定哪些列.否则是否有任何方法可以在不使用Group By子句的情况下使用聚合函数.

sql sql-server group-by sql-server-2005 aggregate-functions

14
推荐指数
3
解决办法
5万
查看次数

如何使用SQL窗口函数计算聚合的百分比

我需要计算表中各种尺寸的百分比.我想通过使用窗口函数来计算分母来简化事情,但是我遇到了问题,因为分子也必须是聚合.

举个简单的例子,请看下表:

create temp table test (d1 text, d2 text, v numeric);
insert into test values ('a','x',5), ('a','y',5), ('a','y',10), ('b','x',20);
Run Code Online (Sandbox Code Playgroud)

如果我只想计算d1中每一行的份额,那么窗口函数可以正常工作:

select d1, d2, v/sum(v) over (partition by d1)
from test;

"b";"x";1.00
"a";"x";0.25
"a";"y";0.25
"a";"y";0.50
Run Code Online (Sandbox Code Playgroud)

但是,我需要做的是计算d1中d2之和的总份额.我正在寻找的输出是这样的:

"b";"x";1.00
"a";"x";0.25
"a";"y";0.75
Run Code Online (Sandbox Code Playgroud)

所以我试试这个:

select d1, d2, sum(v)/sum(v) over (partition by d1)
from test
group by d1, d2;
Run Code Online (Sandbox Code Playgroud)

但是,现在我收到一个错误:

ERROR:  column "test.v" must appear in the GROUP BY clause or be used in an aggregate function
Run Code Online (Sandbox Code Playgroud)

我假设这是因为它抱怨在分组子句中没有考虑窗口函数,但是无论如何窗口函数都不能放在分组子句中.

这是使用Greenplum 4.1,它是Postgresql 8.4的一个分支,并共享相同的窗口函数.请注意,Greenplum无法执行相关子查询.

sql postgresql aggregate-functions window-functions greenplum

14
推荐指数
1
解决办法
1万
查看次数

将DateTime分组为5,15,30和60分钟

我试图将一些记录分为5分钟,15分钟,30分钟和60分钟:

SELECT AVG(value) as "AvgValue",
sample_date/(5*60) as "TimeFive"
FROM DATA
WHERE id = 123 AND sample_date >= 3/21/2012
Run Code Online (Sandbox Code Playgroud)

我想运行几个查询,每个查询将我的平均值分组为所需的时间增量.所以5分钟的查询将返回如下结果:

AvgValue  TimeFive
6.90      1995-01-01 00:05:00
7.15      1995-01-01 00:10:00
8.25      1995-01-01 00:15:00
Run Code Online (Sandbox Code Playgroud)

30分钟的查询将导致:

AvgValue  TimeThirty 
6.95      1995-01-01 00:30:00
7.40      1995-01-01 01:00:00
Run Code Online (Sandbox Code Playgroud)

datetime列的yyyy-mm-dd hh:mm:ss格式

我收到了我的datetime列的隐式转换错误.任何帮助深表感谢!

sql sql-server aggregate-functions sql-server-2008

14
推荐指数
3
解决办法
4万
查看次数

如果所有列值都为true,则返回true

在PostgreSQL中有一种更快的方法来基本上在几行中执行if吗?

说我有一张桌子

ticket | row | archived
1      | 1   | true
1      | 2   | true
1      | 3   | true
2      | 1   | false
2      | 2   | true
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以在ticket =的列下面做一个if语句?因此,ticket = 1的地方是真的

true && true && true = true
Run Code Online (Sandbox Code Playgroud)

并且ticket = 2将是假的,因为

false && true = false
Run Code Online (Sandbox Code Playgroud)

或者我应该坚持下去

SELECT ( (SELECT COUNT(*) FROM table WHERE ticket = 1)
       = (SELECT COUNT(*) FROM table WHERE ticket = 1 AND archived = true) )
Run Code Online (Sandbox Code Playgroud)

sql postgresql boolean-logic exists aggregate-functions

14
推荐指数
2
解决办法
1万
查看次数

在数组上聚合函数

我有这样一张桌子:

+-----+----------------+
| ID  |  array300      |
+-----+----------------+
| 100 | {110,25,53,..} |
| 101 | {56,75,59,...} |
| 102 | {65,93,82,...} |
| 103 | {75,70,80,...} |
+-----+----------------+

array300列是一个包含300个元素的数组.我需要有100个元素的数组,每个元素代表array300的3个元素的平均值.对于这个例子,答案将是:
array100
{62.66,...}
{63.33,...}
{80,...}
{78.33,...}

arrays postgresql aggregate-functions

14
推荐指数
2
解决办法
7257
查看次数

Django聚合 - 表达式包含混合类型.您必须设置output_field

我正在尝试实现聚合查询,这是我的代码:

TicketGroup.objects.filter(event=event).aggregate(
                           total_group=Sum(F('total_sold')*F('final_price')))
Run Code Online (Sandbox Code Playgroud)

我在TicketGroup对象中有'total_sold'和'final_price',我想要做的就是求和并乘以值来得到所有TicketGroup的总销售额.

我得到的只是这个错误:

表达式包含混合类型.您必须设置output_field

我做错了什么,因为我把'total_group'称为我的输出字段?

谢谢!

django aggregate-functions django-orm django-queryset

14
推荐指数
2
解决办法
8859
查看次数

有没有办法将限制参数传递给Spark中的functions.collect_set?

我正在处理一个大型Spark DataFrame中的一列数字,我想创建一个新列,它存储该列中出现的唯一数字的聚合列表.

基本上就是functions.collect_set的作用.但是,我只需要聚合列表中最多1000个元素.有没有办法以某种方式将该参数传递给functions.collect_set(),或者在不使用UDAF的情况下以任何其他方式在聚合列表中仅获取最多1000个元素?

由于列很大,我想避免收集所有元素并在之后修剪列表.

谢谢!

aggregate-functions dataframe apache-spark apache-spark-sql

14
推荐指数
2
解决办法
2771
查看次数