2017-03-22 66 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 


在第二部分。

相关问题