2016-11-11 89 views
1

我有一個場景讓「最大」和「最小」記錄的各字段值 請在下面找到最大和最小值的相應記錄

----------------------------------------------------------------------- 
ID    Label    ProcessedDate 
----------------------------------------------------------------------- 
1    Label1   11/01/2016 
2    Label2   11/02/2016 
3    Label3   11/03/2016 
4    Label4   11/04/2016 
5    Label5   11/05/2016 

樣本數據我有「ID」字段中填充在另一個表中作爲外鍵。在根據「ID」字段查詢該表中的記錄時,我需要獲取「最大」處理日期和「最小」處理日期的「標籤」字段。

----------------------------------------------------------------------- 
    ID  LabelID  GroupingField 
----------------------------------------------------------------------- 
    1  1   101 
    2  2   101 
    3  3   101 
    4  4   101 
    5  5   101 
    6  1   102 
    7  2   102 
    8  3   102 
    9  4   102 

而最終結果集我期望它看起來像這樣。

----------------------------------------------------------------------- 
    GroupingField   FirstProcessed   LastProcessed 
----------------------------------------------------------------------- 
    101     Label1     Label5 
    102     Label1     Label4 

我'幾乎'設法使用rank函數得到上述結果,但仍然不滿意它。所以我在尋找是否有人可以爲我提供更好的選擇。

感謝, Prakazz

回答

1

您可以使用分區通過與集團的組合按如下方式使用SQL ROW_NUMBER()函數

;with cte as (
    select 
     t.Label, t.ProcessedDate, 
     g.GroupingField, 
     ROW_NUMBER() over (partition by GroupingField Order By ProcessedDate ASC) minD, 
     ROW_NUMBER() over (partition by GroupingField Order By ProcessedDate DESC) maxD 

    from tbl t 
    inner join GroupingFieldTbl g 
    on t.ID = g.LabelID 
) 
select GroupingField, max(FirstProcessed) FirstProcessed, max(LastProcessed) LastProcessed 
from (
select 
    GroupingField, 
    FirstProcessed = CASE when minD = 1 then Label else null end, 
    LastProcessed = CASE when maxD = 1 then Label else null end 
from cte 
where 
    minD = 1 or maxD = 1 
) t 
group by GroupingField 
order by GroupingField 

我也用CTE表達,使編碼更容易理解

輸出作爲

enter image description here

+0

是的,看起來不錯!我有幾乎相同的東西只是缺少的東西是我沒有使用CTE和一個額外的分組層次的groupingID。無論如何感謝那! – Prakazz

3
CREATE TABLE #Details (ID INT,LabelID INT,GroupingField INT) 
CREATE TABLE #Details1 (ID INT,Label VARCHAR(100),ProcessedDate VARCHAR(100)) 

INSERT INTO #Details1 (ID ,Label ,ProcessedDate) 
SELECT 1,'Label1','11/01/2016' UNION ALL 
SELECT 2,'Label2','11/02/2016' UNION ALL 
SELECT 3,'Label3','11/03/2016' UNION ALL 
SELECT 4,'Label4','11/04/2016' UNION ALL 
SELECT 5,'Label5','11/05/2016' 


INSERT INTO #Details (ID ,LabelID ,GroupingField) 
SELECT 1,1,101 UNION ALL 
SELECT 2,2,101 UNION ALL 
SELECT 3,3,101 UNION ALL 
SELECT 4,4,101 UNION ALL 
SELECT 5,5,101 UNION ALL 
SELECT 6,1,102 UNION ALL 
SELECT 7,2,102 UNION ALL 
SELECT 8,3,102 UNION ALL 
SELECT 9,4,102 

;WITH CTE (GroupingField , MAXId ,MinId) AS 
(
    SELECT GroupingField,MAX(LabelID) MAXId,MIN(LabelID) MinId 
    FROM #Details 
    GROUP BY GroupingField 
) 


SELECT GroupingField ,B.Label FirstProcessed, A.Label LastProcessed 
FROM CTE 
JOIN #Details1 A ON MAXId = A.ID 
JOIN #Details1 B ON MinId = B.ID