2016-11-11 82 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