标签: aggregate

PostgreSQL:避免多次对相同值进行 SUM

我有一个学生表和一个不同科目的分数表。我想将所有科目的每个学生的 score1 和 score2 相加,然后为每个学生加上奖金。

CREATE TABLE student (
   id serial PRIMARY KEY,
   name text NOT NULL,
   bonus integer NOT NULL,
);

CREATE TABLE score (
  id serial PRIMARY KEY,
  subject text NOT NULL,
  score1 integer NOT NULL,
  score2 integer NOT NULL,
  student_id integer NOT NULL,
  CONSTRAINT s_id FOREIGN KEY (student_id) REFERENCES student (id),
);
Run Code Online (Sandbox Code Playgroud)

连接 score1 和 score2 的查询如下所示:

SELECT st.name, sum(sc.score1 + sc.score2) as total
FROM student st
LEFT JOIN score sc ON sc.student_id = st.id
group by …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate sum

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

postgresql 中的 ceil() 函数行为

在 postgresql 中使用 ceil() 时,我发现它有一些奇怪的行为,请参阅 SQL :

Select  
     *,
     ceil( (550*0.5)/100 ),
     ceil( (58*5)/100 ),
FROM
   XYZ
Run Code Online (Sandbox Code Playgroud)

如果我专注于 ceil 函数的输出,那就很奇怪了:

  • ceil( (550*0.5)/100 ) 返回 3 (将 2.75 转换为 3 )
  • ceil((58*5)/100 ) 返回 2 (将 2.9 转换为 2 )

如果第二条语句接近更大的整数 3 ,为什么它返回 2 ?

postgresql aggregate select

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

比较结果中的日期

我想比较结果集中的日期

例子:

SELECT * FROM tbl WHERE foo=bar
Run Code Online (Sandbox Code Playgroud)

输出

id, datetime, name
1, 2014-01-01 18:13:45, test 1
2, 2014-01-01 19:01:32, test 2
3, 2014-01-01 20:34:44, test 3
4, 2014-01-03 04:45:22, test 4
Run Code Online (Sandbox Code Playgroud)

我希望能够区分每条记录之间的时间差异是小于还是大于前一条记录的 24 小时。

例子:

1, 2014-01-01 18:13:45, test 1 <-- first record since the previous record
2, 2014-01-01 19:01:32, test 2 <-- second record was less than 24 hours since the previous record
3, 2014-01-01 20:34:44, test 3 <-- third record was less than 24 hours since the …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate date

0
推荐指数
1
解决办法
264
查看次数

为什么不能在窗口函数中聚合后进行基本操作?像 (max(x)+5), vs (5+max(x))

聚合和窗口函数的语法令人困惑,这不起作用,

SELECT (max(x)+5) OVER ()
FROM generate_series(1,10) AS t(x);
Run Code Online (Sandbox Code Playgroud)

虽然这有效

SELECT 5+max(x) OVER ()
FROM generate_series(1,10) AS t(x);
Run Code Online (Sandbox Code Playgroud)

如果运算符是可交换的,那很好,但我试图将间隔除以秒(在我的特定情况下,尽管我解决了它)。有没有办法简化这个。

SELECT (max(x)/5) OVER ()
FROM generate_series(1,10) AS t(x);
Run Code Online (Sandbox Code Playgroud)

所以不需要另一个封装查询?这是一个 PostgreSQL 的东西,还是一个 SQL 的东西?有没有办法消除查询的歧义?

postgresql syntax aggregate window-functions

0
推荐指数
1
解决办法
218
查看次数

占总数的百分比:有没有比使用子选择更有效的方法?

我有一个现有的ASSET_SUMMARY_VW观点:

+-----------------------+---------------+
|      ASSET_TYPE       |     COST      |
+-----------------------+---------------+
| TRANSPORTATION        | 1,000,000,000 |
| TRANSPORTATION        |   500,000,000 |
| TRANSPORTATION        |   500,000,000 |
| ACTIVE TRANSPORTATION |   100,000,000 |
| ACTIVE TRANSPORTATION |    50,000,000 |
| STORMWATER MANAGEMENT |   500,000,000 |
+-----------------------+---------------+
Run Code Online (Sandbox Code Playgroud)

我想 GROUP BY 并计算每个ASSET_TYPE与总成本相比的百分比:

+-----------------------+---------------+------------------+
|      ASSET_TYPE       |     COST      | PERCENT_OF_TOTAL |
+-----------------------+---------------+------------------+
| TRANSPORTATION        | 2,000,000,000 |             75.4 |
| ACTIVE TRANSPORTATION |   150,000,000 |              5.6 |
| STORMWATER MANAGEMENT |   500,000,000 | …
Run Code Online (Sandbox Code Playgroud)

performance oracle aggregate computed-column query-performance

0
推荐指数
1
解决办法
1786
查看次数

如何获取同一行中的行值和总和/聚合?(SQL 服务器)

只是想知道我是否有类似的数据

 name  score
    A    2
    B    5
    C    7
Run Code Online (Sandbox Code Playgroud)

我想要第三排

     name  score  total
        A    2     14
        B    5     14
        C    7     14
Run Code Online (Sandbox Code Playgroud)

我的意思是最终 - 我想找到不同总计中不同行条目的“z 分数”或百分位数。我只是不确定是否有一种简单的方法可以将行值与聚合值进行比较,除了通过子查询,例如

select A.name, A.score, B.total
from myTable A
left join
(select name, sum(score) from myTable group by name) B
on A.name = B.name
Run Code Online (Sandbox Code Playgroud)

这可以工作,但是两次查询同一个表来计算什么似乎效率很低。有没有我缺少的更简单的方法?

sql-server aggregate select

0
推荐指数
1
解决办法
5932
查看次数

没有子查询的选择最小值

我有这张桌子:

auctionid   bid     bidtime     bidder      bidderrate  openbid price
8211851222  55      6.021053    smoothy43m  69          50      161
8211851222  51      6.378843    ahmadf316   1           50      161
8211851222  54      6.379225    ahmadf316   1           50      161
8211851222  59.66   6.499745    dang800     5           50      161
8211851222  57      6.654282    txrang10    98          50      161
8211851222  60      6.654583    txrang10    98          50      161
8211851222  65      6.713646    em19680     23          50      161
8211851222  65      6.734225    justin      10          50      161
8211851222  80      6.736042    losiewiczp  1683        50      161
8211851222  67      6.772292    smoothy43m  69          50      161
8211851222  69.01 …
Run Code Online (Sandbox Code Playgroud)

sql-server aggregate

0
推荐指数
1
解决办法
330
查看次数

每小时半点的值总和(那个小时)

我需要用 TS 聚合表的值的“总和”,每个半小时(60 分钟)的值列,即 00:30、01:30、02:30 等

样本数据:

Val TS
1   2019-08-12 00:00:00.013
3   2019-08-12 00:10:00.013
2   2019-08-12 00:20:00.013
2   2019-08-12 00:30:00.013
0   2019-08-12 00:40:00.013
0   2019-08-12 00:50:00.013
1   2019-08-12 01:00:00.013
7   2019-08-12 01:10:00.013
0   2019-08-12 01:20:00.013
1   2019-08-12 01:30:00.013
2   2019-08-12 01:40:00.013
0   2019-08-12 01:50:00.013
2   2019-08-12 02:00:00.013
0   2019-08-12 02:10:00.013
0   2019-08-12 02:20:00.013
0   2019-08-12 02:30:00.013
1   2019-08-12 02:40:00.013
0   2019-08-12 02:50:00.013
4   2019-08-12 03:00:00.013
3   2019-08-12 03:20:00.013
1   2019-08-12 03:30:00.013

Run Code Online (Sandbox Code Playgroud)

我们应该得到这个:

Val TS
10  2019-08-12 00:30:00
5   2019-08-12 …
Run Code Online (Sandbox Code Playgroud)

sql-server aggregate date-math

0
推荐指数
1
解决办法
89
查看次数

SQL 中 TOP 和 MAX()/MIN() 的区别

根据我的经验,如果您的数据库中有数千/数百万行,如本答案以及我在这里回答的内容和提问者的回答SELECT TOP中所示,则要快得多。SELECT MIN()MAX()

\n

我的问题是为什么,根据我的理解,TOP查看数据SELECT column FROM table与执行 a 时相同ORDER BY column,它会对结果进行排序,然后只给出行,而MIN()/MAX()函数实际上应该只查看每一行,检查该行的总和行,然后转到下一行,如果该行是><前一行,则将结果保存在函数中取决于它是否为 saMAX()或 a MIN(),而这正是ORDER BY应该做的。

\n

请不要回答,根据您的经验, 比MAX()更好TOP,因为问题实际上是MAX()/MIN()和之间有什么区别TOP?两者都查看每一行的数据,并且都可能是log(n)

\n

回复@JD:

\n
\n

一个简单的例子是,如果您使用 TOP 而不使用 ORDER BY 子句。然后,您将返回的最高结果可能是不确定的,并且并不总是必须与 MAX() 聚合函数引用的同一行。

\n
\n

当然,我只是问你何时使用ORDER BY …

sql-server aggregate query-performance

0
推荐指数
2
解决办法
4964
查看次数

查找不同用户并发登录的最大数量

我正在寻找提供月份和年份的查询,并显示所选月份的 4(或 5)周,并且每周应显示本周同时登录用户的最大数量。最大用户数应根据 SQL Server 表 usersession 计算。同时意味着同时登录,即它们具有重叠的登录日期时间/注销日期时间。。表和示例

因此,如果存在并发用户,则应给出不同用户的数量,如果该日期存在用户但不并发,则应返回 1,否则返回 0。

我知道这很难。

sql-server query aggregate

-1
推荐指数
1
解决办法
6090
查看次数