我有一个查询,它将选择两个字段,对它们进行分组,然后根据第二个字段的第一个结果对结果进行排序。这两个领域之间存在一对多的关系。
select Product
, Material
from dbo.Files
group by Product, Material
ORDER BY Product, MIN(Material)
结果正是我们想要的。实际上,实际上有几十个“10-001”记录,但我们只得到第一个。
Product Material
10 001
10 002
10 003
10 004
10 005
10 006
10 007
10 008
10 009
11 001
11 009
13 012
13 013
13 014
问题是当我想显示其他列时。显然我不能选择其他列,除非我也将它们添加到group by语句中。但是,当我将它们添加到我的group by语句时,它会更改结果。
这就像我来的一样接近。
select Product
,Material
,XXIMPORT
,Field1
,Field2
,Field3
,Field4
,Field5
from dbo.files
where Field1 is not null
group by Product
,Material
,XXIMPORT
,Field1
,Field2
,Field3
,Field4
,Field5
ORDER BY Product
, MIN(Material)
, MIN(Field1)
, MIN(Field2)
有了这些结果:
Product Material XXIMPORT Field1 Field2
10 NULL NULL OUTER DIAMETER CRITICAL FIT
10 001 5/27/15 Inside Diameter Cross Section
10 001 5/27/15 Part INSIDE DIAMETER
10 002 5/27/15 OUTER DIAMETER INSIDE DIAMETER
10 003 5/27/15 ID OD
10 003 5/27/15 TYPE (TY) Thickness (T)
10 011 5/27/15 OVERALL LENGTH THREAD SIZE
10 012 5/27/15 Height (HT) Outer Diameter (OD)
所以我知道为什么结果正在改变......但是我如何告诉SQL Serve只返回它在匹配的“其他”列中找到的第一个结果?例如,只是顶部的“10-001”行或顶部的“10-003”行。
一切都取决于第一个查询的结果。基于stackoverflow上看起来非常相似的其他帖子,我试图将第一部分放在具有典型结果的子查询中。我也尝试将表连接到自身并添加列,但我必须没有正确的语法。
答案 0 :(得分:1)
您可以利用此处的ROW_NUMBER功能,根据产品和材料,按照您想要的顺序对行进行排序。
Half sync - half async
答案 1 :(得分:0)
首先,你的ORDER BY ... MIN()
毫无意义。在您的分组字词中使用Material
,因此每个组中只有1个可能的值,而MIN是多余的。
至于你的问题,从逻辑上讲,没有定义"第一个"或任何其他与订单相关的功能,除非您明确指定一个(例如使用ORDER BY
)。
您需要明确告诉SQL您希望它做什么。
如果您真的不关心非分组列中的值,请执行以下操作:
1. you probably shouldn't include them in the result set anyway. 2. You could use one of: 2.1. Correlated Subquery with TOP 1 2.2. CROSS APPLY 2.3. PARTITION BY 2....