假設我有這個假表
CREATE TABLE Dim_product (
product_id int4 null primary key,
product_name varchar(100) NULL創建 TABLE dim_territory (
territory_id int4 null primary key,
region varchar(30) NULL創建 TABLE fact_sales (
order_detail_id varchar(30) null primary key,
product_id int4 NULL,
territory_id int4 NULL,
數量int4 NULL。
foreign key(product_id) references dim_product(product_id)。
foreign key(territory_id) references dim_territory(territory_id)
);
insert into dim_product
(product_id, product_name)
values
(1, 'patch kit') 。
(2, '山地自行車')。
(3, 'logo')。
insert into dim_territory
(tritory_id, region)
values
(1, 'AUS') 。
(2, 'FRN') 。
(3, 'GRMN')。
insert into fact_sales
(order_detail_id, product_id, territory_id, quantity)
values'z1', 1, 1, 1) 。
('z2', 1, 1, 3) 。
('z3', 2, 1, 4) 。
('z4', 3, 2, 4) 。
('z5', 3, 2, 2) 。
('y1', 2, 1, 1) 。
('y2', 1, 3, 4) 。
('y3', 2, 3, 5) 。
('x4', 3, 3, 1) 。
('x5',3,2,4)。
我想根據數量知道每個地區的前2個產品
我試著用這段代碼,但它讓我很困惑,lol :Dselect DT.region, DP.product_name, sum(FS.quantity) as quantity
from fact_sales FS
join dim_territory DT
on FS.territory_id=DT.territory_id
join dim_product DP
on FS.territory_id=DT.territory_id
group by product_name, region
order by quantity desc
該代碼的結果是這樣的,這太錯誤了
區域 product_name quantityGRMN補丁包 10
FRN標志 10
GRMN標志 10
FRN山地車 10
GRMN山地車 10
FRN補丁套件10
美國山地車9
美國山地車9
補丁套件9
AUS標志9
我怎樣才能解決這個問題
我怎樣才能解決這個問題?
uj5u.com熱心網友回復:
你在第二次連接時,你使用的變數出現了錯誤。
試一下:
select DT.region, DP.product_name, sum(FS.quantity)as quantity
from fact_sales FS
join dim_territory DT
on FS.territory_id=DT.territory_id
join dim_product DP
on FS.product_id=DP.product_id
group by product_name, region
order by quantity desc
uj5u.com熱心網友回復:
看看視窗函式,特別是rank()、dense_rank()和row_number(),例如
SELECT *。RANK() OVER w AS rank
FROM (
SELECT DT.region, DP.product_name, sum(FS.quantity) as quantity
FROM fact_sales FS
JOIN dim_territory DT ON FS.territory_id=DT.territory_id
JOIN dim_product DP ON FS.product_id=DP.product_id
GROUP BY product_name, region
) j
WINDOW w AS (PARTITION BY區域 ORDER BY數量 DESC
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)。)
如果你想過濾掉排名較低的行,把它放在一個CTE(或另一個子查詢)中,并把結果限制在你想要的排名上:
WITH j AS (
SELECT *, RANK() OVER w AS rank
FROM (
SELECT DT.region, DP.product_name, sum(FS.quantity) as quantity
FROM fact_sales FS
JOIN dim_territory DT ON FS.territory_id=DT.territory_id
JOIN dim_product DP ON FS.product_id=DP.product_id
GROUP BY product_name, region
) i
WINDOW w AS (PARTITION BY區域 ORDER BY數量 DESC
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
)
SELECT * FROM j WHERE rank < = 2;
演示。db<>fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/320136.html
標籤:
