从同一行获取最大值和另一列?

时间:2018-01-04 16:41:48

标签: sql-server-2008 tsql

如何从下表中返回最大值和日期?

declare @t1 table 
(
    id int,
    value int,
    date date
)

insert into @t1
select 1, 100, '2017-01-02'
union
select 1, 200, '2017-01-03'
union
select 1, 300, '2017-01-04'
union
select 2, 400, '2017-02-02'
union
select 2, 500, '2017-02-03'
union
select 2, 600, '2017-02-04'

select id, max(value) from @t1 group by id

以下返回最大值,但我还需要该最大值的日期。在这种情况下,它将是300, '2017-01-04'600, '2017-02-04'

感谢。

4 个答案:

答案 0 :(得分:1)

看起来您希望从每行ID中找到MAX(值)的所有数据。使用分区:

SELECT id, value, date
  FROM (SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY value DESC) AS i, *
          FROM @t1
       ) parts
 WHERE i = 1

当然,如果你的id有重复的MAX(值),你将会遇到所有这些答案的问题。但是你可以通过更改分区顺序来解决这个问题。

例如,要查找MAX(值)的最新行,只需将date DESC添加到PARTITION子句中:

SELECT id, value, date
  FROM (SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY value DESC, date DESC) AS i, *
          FROM @t1
       ) parts
 WHERE i = 1

答案 1 :(得分:0)

将您的表格加入到id所拥有的查询中,然后选择您想要的任何字段:

SELECT a.*
FROM t1 a
INNER JOIN (SELECT  Name, MAX(value) value
            FROM t1
            GROUP BY id) b ON a.id = b.id

答案 2 :(得分:0)

您可以使用公用表表达式(CTE)获取每个ID的最大值,然后加入原始表以获取所需的数据字段。

;WITH grp AS (SELECT id, MAX(value) max_val FROM @t1 GROUP BY id) 
SELECT t.* FROM @t1 t JOIN grp ON t.id = grp.id AND t.value = grp.max_val

前导分号是可选的,但是最好的做法是因为CTE需要终止任何以前的SQL语句。

答案 3 :(得分:0)

试试这个,以获得表格中的最大值及其相关日期:

SELECT value
    ,Date
FROM @t1
where value in (
    select max(value)
    from @T1 
)