[英]Improve SQL Query Runtime
SQL 的新手。我正在嘗試獲取一些每周的趨勢來比較各種指標點。 這是我到目前為止所擁有的。 運行時很糟糕,因為它遍歷整個表 4 次,而且這只是過去 4 周的情況。 有沒有什么方法可以改進這個過程並獲得過去幾周(不僅僅是過去 4 周)的指標?
編輯:這是 MySQL。
樣本數據:
時間戳 | 指標命中 | 公制合計 | 指標值 |
---|---|---|---|
2022-09-20 06:50:01.332000 | 4個 | 4個 | 1個 |
2022-08-31 08:49:59.086000 | 2個 | 3個 | 0.6666 |
2022-08-09 04:50:12.430000 | 1個 | 2個 | 0.5 |
SELECT
sum(metric_hits) as metric_hits_sum,
sum(metric_total) as metrics_total_sum,
avg(metric_value) as metric_value_avg
from metric_events
where timestamp >= DATEADD(DAY, -7-DATEPART(WEEKDAY, GETDATE()::date), GETDATE()::date) and timestamp < DATEADD(DAY, -DATEPART(WEEKDAY, GETDATE()::date), GETDATE()::date)
UNION
SELECT
sum(metric_hits) as metric_hits_sum,
sum(metric_total) as metrics_total_sum,
avg(metric_value) as metric_value_avg
from metric_events
where timestamp >= DATEADD(DAY, -14-DATEPART(WEEKDAY, GETDATE()::date), GETDATE()::date) and timestamp < DATEADD(DAY, -7-DATEPART(WEEKDAY, GETDATE()::date), GETDATE()::date)
UNION
SELECT
sum(metric_hits) as metric_hits_sum,
sum(metric_total) as metrics_total_sum,
avg(metric_value) as metric_value_avg
from metric_events
where timestamp >= DATEADD(DAY, -21-DATEPART(WEEKDAY, GETDATE()::date), GETDATE()::date) and timestamp < DATEADD(DAY, -14-DATEPART(WEEKDAY, GETDATE()::date), GETDATE()::date)
UNION
SELECT
sum(metric_hits) as metric_hits_sum,
sum(metric_total) as metrics_total_sum,
avg(metric_value) as metric_value_avg
from metric_events
where timestamp >= DATEADD(DAY, -28-DATEPART(WEEKDAY, GETDATE()::date), GETDATE()::date) and timestamp < DATEADD(DAY, -21-DATEPART(WEEKDAY, GETDATE()::date), GETDATE()::date)
這應該讓你更接近。 我會讓你添加更多功能(比如一周的開始和結束日期)
select floor((daysold - DATEPART(WEEKDAY, GETDATE()::date)) / 7) as weeksold
, sum(metric_hits) as metric_hits_sum
, sum(metric_total) as metrics_total_sum
, avg(metric_value) as metric_value_avg
from (
SELECT datediff(day, [timestamp], GETDATE()::date) as daysold
, metric_hits
, metric_total
, metric_value
from metric_events
where [timestamp] < DATEADD(DAY, -DATEPART(WEEKDAY, GETDATE()::date), GETDATE()::date)
) q
group by floor((daysold - DATEPART(WEEKDAY, GETDATE()::date)) / 7)
order by 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.