我有一个学生表和一个不同科目的分数表。我想将所有科目的每个学生的 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 中使用 ceil() 时,我发现它有一些奇怪的行为,请参阅 SQL :
Select
*,
ceil( (550*0.5)/100 ),
ceil( (58*5)/100 ),
FROM
XYZ
Run Code Online (Sandbox Code Playgroud)
如果我专注于 ceil 函数的输出,那就很奇怪了:
如果第二条语句接近更大的整数 3 ,为什么它返回 2 ?
我想比较结果集中的日期
例子:
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) 聚合和窗口函数的语法令人困惑,这不起作用,
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 的东西?有没有办法消除查询的歧义?
我有一个现有的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
只是想知道我是否有类似的数据
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)
这可以工作,但是两次查询同一个表来计算什么似乎效率很低。有没有我缺少的更简单的方法?
我有这张桌子:
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) 我需要用 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) 根据我的经验,如果您的数据库中有数千/数百万行,如本答案以及我在这里回答的内容和提问者的回答SELECT TOP中所示,则要快得多。SELECT MIN()MAX()
我的问题是为什么,根据我的理解,TOP查看数据SELECT column FROM table与执行 a 时相同ORDER BY column,它会对结果进行排序,然后只给出顶行,而MIN()/MAX()函数实际上应该只查看每一行,检查该行的总和行,然后转到下一行,如果该行是>或<前一行,则将结果保存在函数中取决于它是否为 saMAX()或 a MIN(),而这正是ORDER BY应该做的。
请不要回答,根据您的经验, 比MAX()更好TOP,因为问题实际上是MAX()/MIN()和之间有什么区别TOP?两者都查看每一行的数据,并且都可能是log(n)。
回复@JD:
\n\n\n一个简单的例子是,如果您使用 TOP 而不使用 ORDER BY 子句。然后,您将返回的最高结果可能是不确定的,并且并不总是必须与 MAX() 聚合函数引用的同一行。
\n
当然,我只是问你何时使用,ORDER BY …
aggregate ×10
sql-server ×5
postgresql ×4
select ×2
date ×1
date-math ×1
oracle ×1
performance ×1
query ×1
sum ×1
syntax ×1