行轉列計算差值的一種優化
http://blog.itpub.net/29254281/viewspace-1379159/
前文在計算差值的時候使用的是union all
先通過左連線計算兩天簽到人數的差值,然後union all當天簽到的使用者,最後行換列
但是這種方式的效率很低,需要掃描三次表.
(前文的資料和本文不一致,下面是本文使用的資料)
受到where in list的啟發,使用如下方式,可以少掃描一次表.極大的提升了效率
where in list問題請參考:
http://blog.itpub.net/29254281/viewspace-1375383/
其中nums是數字輔助表,請參考
http://blog.itpub.net/29254281/viewspace-1362897/
受到啟發的內容
更進一步的優化,其實沒有必要弄得那麼複雜
果真簡單就是美.
前文在計算差值的時候使用的是union all
先通過左連線計算兩天簽到人數的差值,然後union all當天簽到的使用者,最後行換列
但是這種方式的效率很低,需要掃描三次表.
(前文的資料和本文不一致,下面是本文使用的資料)
受到where in list的啟發,使用如下方式,可以少掃描一次表.極大的提升了效率
where in list問題請參考:
http://blog.itpub.net/29254281/viewspace-1375383/
-
select
-
type 型別,
-
sum(case when createtime='2014-12-15' then c else 0 end) 15簽到,
-
sum(case when createtime='2014-12-16' then c else 0 end) 16簽到,
-
sum(case when createtime='2014-12-17' then c else 0 end) 17簽到,
-
sum(case when createtime='2014-12-18' then c else 0 end) 18簽到,
-
sum(case when createtime='2014-12-19' then c else 0 end) 19簽到,
-
sum(case when createtime='2014-12-20' then c else 0 end) 20簽到,
-
sum(case when createtime='2014-12-21' then c else 0 end) 21簽到
-
from
-
(
-
select c.createtime,
-
if(substring_index(substring_index(c.type,',',d.id),',',-1)='增量',c.incre,c.curr) c,
-
substring_index(substring_index(c.type,',',d.id),',',-1) type
-
from
-
(
-
select a.createtime,ifnull(a.c-b.c,0) incre, a.c curr,'增量,當前' type from
-
(
-
select
-
date_format(createtime,'%Y-%m-%d') createtime,
-
count(*) c
-
from award_chance_history
-
group by
-
date_format(createtime,'%Y-%m-%d')
-
) a
-
left join
-
(
-
select
-
date_format(createtime,'%Y-%m-%d') createtime,
-
count(*) c
-
from award_chance_history
-
group by
-
date_format(createtime,'%Y-%m-%d')
-
) b on(a.createtime=b.createtime+ interval 1 day)
-
) c,nums d
-
where d.id <= (length(c.type) - length(replace(c.type,',',''))+1)
-
) a
-
group by type
- order by case when type='當前' then 1 else 0 end desc;
http://blog.itpub.net/29254281/viewspace-1362897/
受到啟發的內容
更進一步的優化,其實沒有必要弄得那麼複雜
-
select
-
type "型別",
-
sum(case when createtime='2014-12-15' then c else 0 end) "15簽到",
-
sum(case when createtime='2014-12-16' then c else 0 end) "16簽到",
-
sum(case when createtime='2014-12-17' then c else 0 end) "17簽到",
-
sum(case when createtime='2014-12-18' then c else 0 end) "18簽到",
-
sum(case when createtime='2014-12-19' then c else 0 end) "19簽到",
-
sum(case when createtime='2014-12-20' then c else 0 end) "20簽到",
-
sum(case when createtime='2014-12-21' then c else 0 end) "21簽到"
-
from
-
(
-
select
-
c.createtime,
-
if(d.id=1,c.incre,c.curr) c,
-
if(d.id=1,'增量','當前') type
-
from
-
(select a.createtime,ifnull(a.c - b.c, 0) incre,a.c curr
-
from (select date_format(createtime, '%Y-%m-%d') createtime, count(*) c
-
from award_chance_history
-
group by date_format(createtime, '%Y-%m-%d')) a
-
left join (select date_format(createtime, '%Y-%m-%d') createtime, count(*) c
-
from award_chance_history
-
group by date_format(createtime, '%Y-%m-%d')) b
-
ON (a.createtime = b.createtime + interval 1 day)) c,
-
nums d
-
where d.id <= 2) t
-
group by type
- order by case when type='當前' then 1 else 0 end desc;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1380980/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 行轉列的一種優化思路優化
- Sql語句實現不同記錄同一屬性列的差值計算SQL
- 第七篇:使用 CUDA 進行計算優化的兩種思路優化
- JS-計算日期差值;計算日期之間的月數JS
- C++ 效能優化篇二《影響優化的計算機行為》C++優化計算機
- COUNT(*)計算行數有哪些優化手段優化
- 分析執行計劃優化SQLORACLE的執行計劃(轉)優化SQLOracle
- 一種支援多種並行環境的柵格地理計算並行運算元並行
- MySQL union的一種優化MySql優化
- 一種更好的優化方式優化
- SQL優化之把運算放在列的另一端SQL優化
- 使用CREATETABLE語句宣告一個計算列(轉)
- DB優化小常識 - 執行計劃中Cardinality的計算優化
- 將TIMESTAMP型別的差值轉化為秒的方法型別
- 雲端計算的7種變化方式
- 行內格式化上下文中的各種高度計算
- [效能優化]UITableView效能優化的一點感悟及計算UILabel高度的新方法優化UIView
- 隔兩行生一行計算變化率
- Android效能優化篇之計算效能優化Android優化
- 優先佇列的一種實現方式—堆佇列
- Android計算兩個時間戳的差值,以字串的形式表示Android時間戳字串
- Spark SQL中列轉行(UNPIVOT)的兩種方法SparkSQL
- SQL優化--用各種hints優化一條SQLSQL優化
- 隔兩行生一行計算變化率(續)
- 一種適用於中小型企業進行計算機輔助管理的方法(轉)計算機
- 一個行轉列的應用
- SQL 行轉列,列轉行SQL
- Mysql - 行轉列、列轉行MySql
- 使用TimeSpanC#中使用TimeSpan計算兩個時間的差值C#
- oracle 11g的行轉列、列轉行Oracle
- sql的行轉列(PIVOT)與列轉行(UNPIVOT)SQL
- 計算列
- 使用預計算分割槽優化引數化優化
- 行列轉換,列行轉換統計
- Sql優化(二) 快速計算Distinct CountSQL優化
- 地理空間距離計算優化優化
- 轉摘_使用leading(,)優化sql執行計劃優化SQL
- bc : 一個命令列計算器命令列