2017-05-10 62 views
1

如何选择区别具有MAX(列)值的行中的另一列引用。 这是我的表:如何在MAX中按行选择DISTINCT另一列(列值)

Category | Desc | Total1 | Total2 | MaxDate | Topic 
-------------------------------------------------------- 
    A  | A Desc | 1 | 3 | 2017-04-01 | Topic1 
    A  | A Desc | 1 | 1 | 2017-05-10 | Topic2 
    B  | B Desc | 1 | 1 | 2017-03-25 | Topic3 

我想从MaxDate栏中选择参考最大值Topic列。我想表是这样的:

Category | Desc | Total1 | Total2 | MaxDate | Topic 
-------------------------------------------------------- 
    A  | A Desc | 2 | 4 | 2017-05-10 | Topic2 
    B  | B Desc | 1 | 1 | 2017-03-25 | Topic3 

然后Total1Total2是从SUM行值都不同

+0

@stvfns请检查答案,让我知道如果再需要帮助 – mohan111

回答

2

立足于这样的数据我们也可以实现

Declare @Table1 TABLE 
    (Category varchar(1), Descp varchar(6), Total1 int, Total2 int, MaxDate datetime, Topic varchar(6)) 
; 

INSERT INTO @Table1 
    (Category, Descp, Total1, Total2, MaxDate, Topic) 
VALUES 
    ('A', 'A Desc', 1, 3, '2017-04-01 00:00:00', 'Topic1'), 
    ('A', 'A Desc', 1, 1, '2017-05-10 00:00:00', 'Topic2'), 
    ('B', 'B Desc', 1, 1, '2017-03-25 00:00:00', 'Topic3') 
; 

SCRIPT

Select TT.Category, 
    TT.Descp, 
    TT.Total1, 
    TT.Total2, 
    TT.MaxDate, 
    T.Topic 
      From @Table1 T 
    INNER JOIN (
    select 
     Category,Descp, 
      SUM(Total1)Total1, 
      SUM(Total2)Total2, 
      Max(MaxDate)MaxDate 
        from @Table1 
    GROUP BY Category,Descp)TT 
    ON T.MaxDate = TT.MAXDATE 
+0

谢谢。我认为这是简单的方法。我不明白使用分区像在另一个答案 – Stfvns

+0

@ mohan111我认为你的'ON'子句应该是'ON T.MaxDate = TT.MAXDATE和T.category = TT.category) – TriV

+0

@Stfvns:然后尝试学习如何要使用它们,我在我的答案中添加了一些参考 – TriV

1

使用可以使用row_numbersum() over()这样

DECLARE @SampleData AS TABLE 
    (
     Category varchar(10), [Desc] varchar(20), Total1 int, Total2 int, MaxDate datetime, Topic varchar(10) 
) 

    INSERT INTO @SampleData VALUES 
('A','A Desc', 1, 3, '2017-04-01', 'Topic1'), 
('A','A Desc', 1, 1, '2017-05-10', 'Topic2'), 
('B','B Desc', 1, 1, '2017-03-25', 'Topic3') 

;WITH temp AS 
(
    SELECT sd.Category, sd.MaxDate, sd.Topic, sd.[Desc], 
     row_number() OVER(PARTITION BY sd.Category ORDER BY sd.MaxDate desc) AS Rn, 
     Sum(sd.Total1) OVER(PARTITION BY sd.Category) AS Total1, 
     Sum(sd.Total2) OVER(PARTITION BY sd.Category) AS Total2 
    FROM @SampleData sd 
) 
SELECT t.Category, t.[Desc], t.Total1,t.Total2, t.MaxDate, t.ToPic 
FROM temp t 
WHERE t.Rn = 1 

演示链接:http://rextester.com/NQI25173

相关问题