LC 197 上升的温度
需求:编写解决方案,找出与之前(昨天的)日期相比温度更高的所有日期的 id
。
代码:
select w2.id from Weather as w1 join Weather as w2
on DateDiff(w2.recordDate , w1.recordDate) = 1
where w2.temperature > w1.temperature
知识点
1.DateDiff函数(a,b)接受两个时期,并计算出a-b的值
2. 使用join自连接产生的笛卡尔积,结合DateDiff函数,可以轻松的找到相邻的两天
join的语法:
表1 join 表2 on 连接条件
3.
ON
:用于指定 表连接的条件,应始终在JOIN
后使用,这俩是固定搭配-
WHERE
:用于对 连接后的结果 进行过滤。
4.sql语句中的特定书写顺序
SQL 查询的完整语法顺序
-
SELECT
指定要查询的列或表达式。 -
FROM
指定数据来源的表(或子查询)。后面可能有连接 -
WHERE
过滤行数据(分组前的过滤)。 -
GROUP BY
对结果进行分组(通常与聚合函数一起使用)。 -
HAVING
过滤分组后的结果(分组后的过滤)。 -
ORDER BY
对结果排序。 -
LIMIT
/ OFFSET
限制返回的行数或分页
1661. 每台机器的进程平均运行时间
需求:
现在有一个工厂网站由几台机器运行,每台机器上运行着 相同数量的进程 。编写解决方案,计算每台机器各自完成一个进程任务的平均耗时。
完成一个进程任务的时间指进程的'end' 时间戳
减去 'start' 时间戳
。平均耗时通过计算每台机器上所有进程任务的总耗费时间除以机器上的总进程数量获得。
结果表必须包含machine_id(机器ID)
和对应的 average time(平均耗时) 别名 processing_time
,且四舍五入保留3位小数。
答案如下:
select a.machine_id , round(avg( b.timestamp - a.timestamp) , 3) as processing_time
from
Activity as a join Activity as b on a.machine_id = b.machine_id and a.process_id = b.process_id
and b.activity_type = 'end' and a.activity_type = 'start'
group by machine_id
知识点
1.round(x , [y]) 表示返回 离 x 最近的整数,可选参数 y 表示要四舍五入的小数位数,如果省略,则返回整数。
2.聚合函数avg:
AVG(expression) | 返回一个表达式的平均值,expression 是一个字段 | 返回 Products 表中Price 字段的平均值: |
3.聚合函数后面 常常跟着group by 指定分组条件
比如此处的 , 如果不加 group by a.machine_id
avg(b.timestamp - a.timestamp)
会直接把所有行的 timestamp的差值求平均,那么此时就会报错,因为前面还select 了一个a.machine_id , sql引擎不知道把这个全局平均值分配给谁
因此,加上group by之后,会按a.machine_id分组后再求平均值 ,比方说a.machine_id = 0有两行,就会把这两行的数据求平均值,分为一组,同理1 , 2。
4.常见的聚合函数: SUM
、AVG
、COUNT
、MAX
、MIN ,
当 SELECT
语句中同时包含聚合函数和非聚合列 时,必须使用 GROUP BY
对非聚合列分组。否则会报错!