假设我有以下表定义:
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) 在我当前的应用程序中,我需要能够执行此类查询:
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表,并且在每一行中都有一个名为"value"的字段,字段值因行而异.我想要的是选择所有行并计算所有"值"字段的总和.
任何的想法?
到目前为止,我已经编写了Aggregate函数,后跟Group By子句,以查找基于SUM,AVG和其他Aggregate函数的值.我在Group By子句中有点混乱.当我们使用Aggregate函数时,我需要在Group By子句中指定哪些列.否则是否有任何方法可以在不使用Group By子句的情况下使用聚合函数.
我需要计算表中各种尺寸的百分比.我想通过使用窗口函数来计算分母来简化事情,但是我遇到了问题,因为分子也必须是聚合.
举个简单的例子,请看下表:
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
我试图将一些记录分为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列的隐式转换错误.任何帮助深表感谢!
在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) 我有这样一张桌子:
+-----+----------------+
| 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,...}
我正在尝试实现聚合查询,这是我的代码:
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'称为我的输出字段?
谢谢!
我正在处理一个大型Spark DataFrame中的一列数字,我想创建一个新列,它存储该列中出现的唯一数字的聚合列表.
基本上就是functions.collect_set的作用.但是,我只需要聚合列表中最多1000个元素.有没有办法以某种方式将该参数传递给functions.collect_set(),或者在不使用UDAF的情况下以任何其他方式在聚合列表中仅获取最多1000个元素?
由于列很大,我想避免收集所有元素并在之后修剪列表.
谢谢!
sql ×7
postgresql ×4
mysql ×2
sql-server ×2
apache-spark ×1
arrays ×1
database ×1
dataframe ×1
django ×1
django-orm ×1
exists ×1
greenplum ×1
group-by ×1