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
?對非聚合列分組。否則會報錯!