我是SQL的新手,所以希望这有一个简单的答案.
我有一个学生表(studentID,name,statusID)和StudentsClasses表(studentID,classID).我被要求从上面的表中创建一个返回以下列的视图:
classID :(分组)
每个班级的学生数量AS学生
statusID = 1作为活动的学生数
statusID = 2的学生数量为非活动人数
我可以轻松地按classID colunm分组并计算学生数量,但我不认为count函数可以被告知只计算某些行.一旦我添加where或having子句,我就会丢失记录,我需要在其他列中计算.我是否需要编写几个不同的查询然后加入每个查询的结果?
感谢您的任何帮助,您可以提供!
-大卫
我正在尝试修复一个大型股票交易所数据库的错误.一列(数量)在每个刻度上具有交易量,而其他列存储累积量(即,当天的先前刻度的总和).在某些情况下,这第二列是错误的(不是很多,所以我们可以安全地假设相邻的刻度线没有错误).因此理论上修复很容易:只需搜索累积量减少的刻度(这就足够了),然后从最后一个刻度中选择累积量并将当前刻度的数量相加.问题是我一直在努力开始在oracle中执行此操作的查询,但由于我缺乏sql的专业知识,我正在努力.这是我到目前为止所获得的:
update
(
select m.cumulative_volume, q.cum_volume_ant, q.quantity from
market_data_intraday_trades m
join
(
select * from
(select
product_key,
sequence_number,
lead(product_key) over (order by product_key, sequence_number) as product_key_ant,
to_char(trade_date_time, 'yyyymmdd') as fecha,
to_char(lag(trade_date_time) over (order by product_key, sequence_number), 'yyyymmdd') as fecha_ant,
cumulative_volume,
lead(cumulative_volume) over (order by product_key, sequence_number) as cum_volume_ant,
cumulative_volume - lead(cumulative_volume) over (order by product_key, sequence_number) as dif
from market_data_intraday_trades)
where product_key = product_key_ant
and fecha = fecha_ant
and dif < 0
and rownum < 10
) q
on m.sequence_number …Run Code Online (Sandbox Code Playgroud) 我有一个行列表,我想在分组(一种COUNT)时对行数进行求和,但仅在每行时,字段customField = 0.
示例:
title customField
aaa 1
aaa 0
bbb 0
ccc 1
bbb 1
aaa 0
Run Code Online (Sandbox Code Playgroud)
所以,输出应该是:
aaa 2
bbb 1
ccc 0
Run Code Online (Sandbox Code Playgroud)
我怎么能用MySql做到这一点?
编辑
实际上我真正的查询是这样的:
SELECT forum_categories.title, COUNT(forum_topics.id) AS total_topics, COUNT(forum_messages.id) AS total_replies, MAX(forum_messages.date) AS last_message
FROM forum_categories
JOIN forum_topics ON forum_topics.category_id = forum_categories.id
JOIN forum_messages ON forum_messages.topic_id = forum_topics.id
GROUP BY forum_categories.id ORDER BY forum_categories.date
Run Code Online (Sandbox Code Playgroud)
而且我必须COUNT(forum_messages.id) AS total_replies只计算forum_messages.original=0,这就是为什么我要求SUM :)
我有如下查询
SELECT a.*, b.*
(SELECT ATTR1, ATTR2, sum(QUANTITY) AS TOTAL_QTY,
ATTR3 FROM TABLE_A
WHERE ATTR4 > 0
GROUP BY ATTR1, ATTR2, ATTR3) a,
TABLE_B b
WHERE a.ATTR1 = b.ATTR1
AND a.ATTR2 = b.ATTR2
Run Code Online (Sandbox Code Playgroud)
我GROUP BY只ATTR1需要计算正确的TOTAL_QTY,但唯一的原因是我将其他属性分组,因为Oracle要求if GROUP BY子句存在,那么所有SELECT属性也应该在GROUP BY子句中.
这意味着每次我需要Table_A中的此查询中的属性时,我也需要将其放入GROUP BY.这不仅看起来很丑陋,而且可能会产生性能影响,也许会产生不可预见的副作用.
如何TOTAL_QTY在ATTR1没有GROUP BY子句的情况下重写上面的查询来计算每个组?
我在表"user"中有2个整数字段:leg_count和leg_length.第一个存储用户的腿数,第二个存储它们的总长度.
属于用户的每条腿存储在单独的表中,只要典型的互联网用户可以有零到无限的腿:
CREATE TABLE legs (
user_id int not null,
length int not null
);
Run Code Online (Sandbox Code Playgroud)
我想在一个查询中重新计算所有用户的统计信息,所以我尝试:
UPDATE users SET
leg_count = subquery.count, leg_length = subquery.length
FROM (
SELECT COUNT(*) as count, SUM(length) as length FROM legs WHERE legs.user_id = users.id
) AS subquery;
Run Code Online (Sandbox Code Playgroud)
并获取"FROM中的子查询不能引用相同查询级别的其他关系"错误.
所以我必须这样做
UPDATE users SET
leg_count = (SELECT COUNT(*) FROM legs WHERE legs.user_id = users.id),
leg_length = (SELECT SUM(length) FROM legs WHERE legs.user_id = users.id)
Run Code Online (Sandbox Code Playgroud)
是什么让数据库为每一行执行2个SELECT,但是,所需的数据可以在一个SELECT中计算:
SELECT COUNT(*), SUM(length) FROM legs;
Run Code Online (Sandbox Code Playgroud)
是否可以优化我的UPDATE查询以仅使用一个SELECT子查询?
我使用PostgreSQL,但我相信,任何SQL方言都存在解决方案.
TIA.
我有一个小问题.我有一个这种格式的PostgreSQL表
time (datetime) | players (int) | servers (int)
---------------------------------------------------
2013-12-06 13:40:01 | 80 | 20
2013-12-06 13:41:13 | 78 | 21
etc.
Run Code Online (Sandbox Code Playgroud)
我想将它们分组为5分钟,并将该组的平均值作为单个值,因此将有20%的记录,每个记录包含平均~5个数字,时间设置为第一次的值群组.我不知道如何在PgSQL中做到这一点.结果将是:
2013-12-06 13:40:01 | avg of players on :40, :41, :42, :43, :44 | same with servers
2013-12-06 13:45:05 | avg of players on :45, :46, :47, :48, :49 | same with servers
2013-12-06 13:50:09 | avg of players on :50, :51, :52, :53, :54 | same with servers
2013-12-06 13:55:12 | avg of players on :55, …Run Code Online (Sandbox Code Playgroud) sql postgresql timestamp aggregate-functions generate-series
我有一个包含多个数据库的数据库url和一个created_at与这些数据库相关联的date()url.
我希望有类似的东西:
Select DISTINCT url, "the first date of this url"
from database
where blabala
Run Code Online (Sandbox Code Playgroud)
我的问题是当一个日期添加到选择我得到这个:
/url/sdfsd | 2014-07-19
/url/sdfsd | 2014-07-20
/url/sdfsd | 2014-07-25
Run Code Online (Sandbox Code Playgroud)
而我想要的只是:
/url/sdfsd | 2014-07-19
Run Code Online (Sandbox Code Playgroud)
我意识到我过度简化了我的问题,但多亏了你们,我设法找到了解决方案
select req2.date, COUNT(DATE(req2.date)) as count
from (
select hash_request -> 'PATH_INFO', min(DATE(created_at)) as date
from (
select *
from request_statistics
where LOWER(hash_request -> 'HTTP_USER_AGENT') LIKE '%google%'
) req1
group by hash_request -> 'PATH_INFO'
) req2
group by req2.date
order by req2.date asc
Run Code Online (Sandbox Code Playgroud)
我很难将所有独特网址上的日期分组.现在我有,每天所有独特网址的唯一网址数量
假设我有一个如下表:
id | key | user_id | value
---------------------------------------
8 | bp_diastolic | 1 | 93.0
7 | bp_systolic | 1 | 128.0
20 | bp_systolic | 2 | 108.0
21 | bp_diastolic | 2 | 76.0
35 | bp_diastolic | 3 | 113.0
34 | bp_systolic | 3 | 101.0
48 | bp_systolic | 4 | 115.0
49 | bp_diastolic | 4 | 77.0
62 | bp_systolic | 5 | 143.0
63 | bp_diastolic | 5 | 104.0
77 …Run Code Online (Sandbox Code Playgroud) 我在密钥,值结构中有RDD(someKey,(measure1,measure2)).我按键分组,现在我想聚合每个键的值.
val RDD1 : RDD[(String,(Int,Int))]
RDD1.groupByKey()
Run Code Online (Sandbox Code Playgroud)
我需要的结果是:
key: avg(measure1), avg(measure2), max(measure1), max(measure2), min(measure1), min(measure2), count(*)
Run Code Online (Sandbox Code Playgroud) 我有一个复杂的数据库,其中的键和值存储在不同的表中。当为应用程序提取值时,对它们进行汇总很有用:
SELECT array_agg(key_name), array_agg(vals)
FROM (
SELECT
id,
key_name,
array_agg(value)::VARCHAR(255) AS vals
FROM factor_key_values
WHERE id=20
GROUP BY key_name, id
) f;
Run Code Online (Sandbox Code Playgroud)
在我的情况下,此特定查询给出以下无效的JSON:
-[ RECORD 1 ]-----------------------------------------------------------------------
array_agg | {"comparison method","field score","field value"}
array_agg | {"{\"text category\"}","{100,70,50,0,30}","{A,B,C,F,\"No Experience\"}"}
Run Code Online (Sandbox Code Playgroud)
请注意,仅在字符串包含空格的情况下才引用varchars数组。我将其范围缩小到的行为ARRAY_AGG。为了完整起见,下面是一个示例:
BEGIN;
CREATE TABLE test (txt VARCHAR(255));
INSERT INTO test(txt) VALUES ('one'),('two'),('three'), ('four five');
SELECT array_agg(txt) FROM test;
Run Code Online (Sandbox Code Playgroud)
结果将是:
{one,two,three,"four five"}
Run Code Online (Sandbox Code Playgroud)
这就是为什么我的JSON损坏的原因。我可以处理应用程序代码中未加引号或字符串的字符串,但有一些混淆。
有什么解决办法吗?
sql ×8
postgresql ×4
group-by ×2
oracle ×2
sql-update ×2
apache-spark ×1
arrays ×1
count ×1
join ×1
json ×1
mysql ×1
rdd ×1
scala ×1
timestamp ×1