2015-07-01 29 views
0

我有一個查詢,將選擇兩個字段,將它們分組,然後根據第二個字段的第一個結果排序結果。這兩個領域之間有一對多的關係。組由2個字段,而從其他列返回第一個值

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 

問題是當我想顯示其他列。顯然我不能選擇額外的列,除非我也將它們添加到組聲明。但是當我將它們添加到我的羣組聲明中時,它會更改結果。

這和我來的很接近。

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即成剛剛返回的第一個結果發現在匹配「其他「列?例如,只有頂部的「10-001」行或頂部的「10-003」行。

一切都取決於第一個查詢的結果。基於看起來非常相似的stackoverflow上的其他帖子,我試圖把第一部分與典型結果的子查詢。我也嘗試加入表格本身並添加列,但我不能有正確的語法。

回答

1

您可以充分利用這裏的ROW_NUMBER功能在您希望的順序排序行,基於在產品和材料上。

WITH cteFiles AS (
    SELECT Product 
      ,Material 
      ,XXIMPORT 
      ,Field1 
      ,Field2 
      ,Field3 
      ,Field4 
      ,Field5 
      ,ROW_NUMBER() OVER(PARTITION BY Product, Material ORDER BY Field1, Field2) AS RowNum 
     FROM dbo.Files 
) 
SELECT * 
    FROM cteFiles 
    WHERE RowNum = 1; 
0

首先,您的ORDER BY ... MIN()是沒有意義的。 Material用於分組術語,因此每個組中只有1個可能的值,而MIN是多餘的。

至於你的問題,除非你明確地指定了一個(例如使用ORDER BY),否則邏輯上沒有「first」或任何其他順序相關特徵的定義。

你需要明確告訴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.... 
相關問題