人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

postgresql使用filter進行多維度聚合的解決方法

發(fā)布日期:2022-01-22 08:08 | 文章來源:腳本之家

你有沒有碰到過有這樣一種場景,就是我們需要看一下某個時間段內(nèi)各種維度的匯總,比如這樣:最近三年我們賣了多少貨?有多少訂單?平均交易價格多少?每個店鋪賣了多少?交易成功的訂單有多少?交易失敗的訂單有多少? 等等...,假使這些數(shù)據(jù)的明細都在一個表內(nèi),該這么做呢? 有沒有簡單方式?還有如何減少全表掃描以更改的拿到數(shù)據(jù)?

如果只是簡單的利用聚合拿到數(shù)據(jù)可能您需要寫很多sql,具體表現(xiàn)為每一個問題寫一段sql 相互之間join起來,這樣也許是個好主意,不過對于未充分優(yōu)化的數(shù)據(jù)庫系統(tǒng),針對每一塊的問題求解可能就是一個巨大的表掃描,當然還有一個問題就是重復(fù)的where條件,所以能不能把相同的where條件抽取出來以簡化sql呢?讓我們思考一下,也許有這樣的解決辦法~ (結(jié)論是有,當然有,哈哈哈~)

首先我提供下基本的表結(jié)構(gòu)及測試數(shù)據(jù)

基本表結(jié)構(gòu)

CREATE TABLE "order_info" (
  "id" numeric(22) primary key ,
  "oid" varchar(100) COLLATE "pg_catalog"."default",  -- 訂單號
  "shop" varchar(100) COLLATE "pg_catalog"."default", -- 店鋪
  "date" date NOT NULL, --訂單日期
  "status" varchar(100) COLLATE "pg_catalog"."default", -- 訂單狀態(tài)
  "payme

初始化表數(shù)據(jù)

INSERT INTO "order_info"("id", "oid", "shop", "date", "status", "payme

準備個問題

這里我找?guī)讉€基本的問題,比如: 1.我們要找最近兩年(2019、2020)有多少筆交易?+ 2.交易成功的平均價格多少? + 3.交易成功的訂單有多少? + 4.店鋪1、2、3分別賣了多少?

使用filter前

對于以上同類多維度數(shù)據(jù)求解這里推薦filter,可能熟悉同學(xué)大概會記得有這么個用法,不過我們還是簡單的思考下:
如果我們將條件篩選放在一個查詢里面(不含子查詢及表連接) , 這樣會在末尾where條件內(nèi)放置公共條件, 隨后我們使用filter對每個結(jié)果進行特定的篩選,也許就好了
OK,來嘗試使用filter解決以下問題: 找最近兩年(2019、2020)有多少筆交易?

問題求解

我們上面拋出了個問題: 找最近兩年(2019、2020)有多少筆交易?
很顯然這個結(jié)果集框定的范圍是2019年和2020年 ,所以~

select 
	count(1)  as 交易總訂單_20_and_19,
	count(1)  filter  ( where date>=to_date('2020-01-01','yyyy-MM-dd') and date < to_date('2021-01-01','yyyy-MM-dd')  )  as 交易總訂單_20,
	count(1)  filter ( where date>=to_date('2019-01-01','yyyy-MM-dd') and date < to_date('2020-01-01','yyyy-MM-dd')  )  as 交易總訂單_19
from  order_info 
where date   >= date_trunc('year',to_date('2021-07-12','yyyy-MM-dd')+interval '-2 year')::date
and date < date_trunc('year',to_date('2021-07-12','yyyy-MM-dd'))::date

運行結(jié)果:

交易總訂單_20_and_19 | 交易總訂單_20 | 交易總訂單_19
----------------------+---------------+---------------
45 | 24 | 21
(1 row)

如果你是首次使用filter子句,這里我簡單的驗證下,就驗證2019年多少訂單吧:

select count(1) as 交易總訂單_19 from order_info where date>=to_date('2019-01-01','yyyy-MM-dd') and date < to_date('2020-01-01','yyyy-MM-dd') ;

交易總訂單_19
---------------
21
(1 row)

【注意,不論您篩選的上面什么范圍內(nèi)的數(shù)據(jù),一定要考慮 where條件一定要框定當前所有結(jié)果集合最大的范圍,不然sql運行的結(jié)果不及預(yù)計~ 】

最后,對于一開始的問題給出一個參考sql:

select 
	count(1)  as 交易總訂單_20_and_19,
	count(1)  filter  ( where date>=to_date('2020-01-01','yyyy-MM-dd') and date < to_date('2021-01-01','yyyy-MM-dd')  )  as 交易總訂單_20,
	count(1)  filter ( where date>=to_date('2019-01-01','yyyy-MM-dd') and date < to_date('2020-01-01','yyyy-MM-dd')  )  as 交易總訂單_19,
	avg(payment) filter (where  status='交易成功' )  as 交易成功的均價,
	count(1) filter (where  status='交易成功' )  as 交易成功的訂單數(shù),
	count(1) filter (where  status!='交易成功' )  as 交易失敗的訂單數(shù),
	sum(payment) filter (where  status='交易成功' and shop='店鋪1' )  as 店鋪1交易額,
	sum(payment) filter (where  status='交易成功' and shop='店鋪2' )  as 店鋪2交易額,
	sum(payment) filter (where  status='交易成功' and shop='店鋪3' )  as 店鋪3交易額
from  order_info 
where date   >= date_trunc('year',to_date('2021-07-12','yyyy-MM-dd')+interval '-2 year')::date
and date < date_trunc('year',to_date('2021-07-12','yyyy-MM-dd'))::date

到此這篇關(guān)于postgresql使用filter進行多維度聚合的文章就介紹到這了,更多相關(guān)postgresql多維度聚合內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部