2017-03-22 83 views
1

我想從表中的3列計算體積並返回唯一的體積。我們有很多行與Width,HeightLength相同,因此我的體積計算自然會有Volume的重複返回值。我認爲,爲了做到這一點,我必須用OVERPARTITIONCTE的別名不允許在OVER在OVER中使用CTE(PARTITION BY)

WITH 
cteVolume (Id, Volume) 
AS 
(
    SELECT Id, Width * Height * [Length] AS Volume FROM PackageMaterialDimensions 
) 
SELECT * 
INTO #volumeTempTable 
FROM (
SELECT pp.ID, (pp.Width * pp.Height * pp.[Length]) AS Volume, 
ROW_NUMBER() OVER(PARTITION BY cte.Volume ORDER BY pp.ID DESC) rn 
FROM PlanPricing pp 
INNER JOIN cteVolume cte ON pp.ID = cte.Id 
) a 
WHERE rn = 1 

SELECT * FROM #volumeTempTable 
ORDER BY Volume DESC 

DROP TABLE #volumeTempTable 

注中引用的印象,對臨時表的原因是因爲我打算對這些數據做一些額外的工作。我也是正在調試,所以我用這些表輸出到數據窗口

這裏是什麼不對這個查詢
- 它仍然是返回重複
- 它只返回一個卷每一行
- 只有當有71000個表中的行返回約75行

我怎麼能修改此查詢基本上做到以下
- 計算容積對於表中的每一行
- SELECT行具有唯一的體積計算。 (我不希望看到的相同體積兩次在我的結果集)

編輯 - 按要求

當前數據提供的數據集忽略額外列
enter image description here

什麼我想是
ID |卷
193 | 280
286 | 350
274 | 550
241 | 720

基本上,我想計算量的每一行的話,我想以某種方式組由以各組

+1

請闡明「SELECT rows DISTINCT by volume」的含義。樣本數據和期望的結果將有所幫助。 –

+1

@Adrian是'SELECT MIN(id),Width * Height * [Length] AS Volume FROM PackageMaterialDimensions GROUP BY Width * Height * [Length]'insufficient? –

回答

1

這是不是你想要做什麼削減重複和選擇第一行卷?

WITH cteVolume (Id, Volume) AS (
     SELECT Id, Width * Height * [Length] AS Volume 
     FROM PackageMaterialDimensions 
    ) 
SELECT DISTINCT volume 
FROM CTE ; 

如果你想每卷一個ID:

WITH cteVolume (Id, Volume) AS (
     SELECT Id, Width * Height * [Length] AS Volume 
     FROM PackageMaterialDimensions 
    ) 
SELECT volume, MIN(Id) as Id 
FROM CTE 
GROUP BY volume; 
+0

不,因爲我在結果集中有重複的卷。我剛剛更新了你所要求的信息。讓我知道,如果這個信息澄清的事情。 – Adrian

+0

我可以在你建議的查詢中做一個'DISTINCT',但問題現在變成我需要更多的數據而不僅僅是音量。我需要最低限度的Ids – Adrian

0

也許你的問題是從分區cte.volume來從PackageMaterialDimensions表,但你也從PlanPricing表中選擇pp.volume

無法確認沒有關於您的數據集和表格的更多信息。

0

據我所見,你不能在CTE的遞歸部分使用windows函數。你必須在CTE部分內手動求和。 所以,與其

ROW_NUMBER() OVER(PARTITION BY cte.Volume ORDER BY pp.ID DESC) rn 

只寫在第一部分

1 as rn 

rn+1 as rn 


在第二部分。

相關問題