使用MS SQL按照Max值返回选定的行而不重复

时间:2016-08-30 11:25:34

标签: sql sql-server join stored-procedures aggregate-functions

我正在使用MS SQL数据库。我需要根据Max值选择行而不重复。尝试下面给出的SQL QUERY

Select  CId, 
        Rate,
        Max(FDateTime) 
from FTable 
Where OId = 1413 and type = 'C'
Group by CId,Rate

但它提供了重复的值。

我需要根据MAX(FDateTime)评估价值和CID。我怎样才能实现这个输出?

我也尝试了内连接概念,但我在这个概念上遇到了一些错误。

5 个答案:

答案 0 :(得分:1)

试试这个

  SELECT CID ,Rate ,FDateTime 
  FROM (SELECT   CID ,Rate ,FDateTime,RANK() OVER (PARTITION BY CID  ORDER BY FDateTime DESC) rank
         FROM FTable WHERE OId = 1413 and TYPE = 'C') AS T  WHERE rank=1
 ORDER BY CID 

答案 1 :(得分:0)

使用row_number()

select ft.*
from (Select ft.*,
             row_number() over (partition by cid, rate order by fdatetime desc) as seqnum
      from FTable ft
      where ft.OId = 1413 and ft.type = 'C'
     ) ft
where seqnum = 1;

答案 2 :(得分:0)

为此您应该使用窗口函数(如果您的Sql-Server版本允许):

WITH TMP AS (
 SELECT CId, Rate, ROW_NUMBER() OVER(PARTITION BY CId, Rate ORDER BY FDateTeim DESC) AS RNK
 FROM my_table
 WHERE .... )
SELECT CId, Rate
FROM TMP
WHERE RNK = 1

MSDN ROW_NUMBER()

答案 3 :(得分:0)

您可以使用外部申请获取特定MAX(FDateTime)OId的{​​{1}}:

[type]

输出:

;WITH FTable AS (
SELECT *
FROM (VALUES
(106, 6, '2016-05-12 16:15:06.340','C',1413),
(109, 6, '2016-07-28 15:33:06.247','C',1413),
(109, 6, '2016-08-09 20:37:33.643','C',1413),
(111, 6, '2016-08-08 21:23:00.487','C',1413),
(106, 7, '2016-05-18 12:50:35.210','C',1433)
) as t(CId,Rate,FDateTime,[type],OId)
)


SELECT  f.CId, 
        f.Rate,
        f.FDateTime
FROM FTable f
OUTER APPLY (
    SELECT MAX(FDateTime) fdate
    FROM FTable 
    WHERE OId = f.OID and [type] = f.[type]
    ) as t
WHERE f.OId = 1413 and f.[type] = 'C' and t.fdate=f.FDateTime

答案 4 :(得分:0)

MAX(FDateTime)的所有费率和CID在OId = 1413和类型=' C'

select  CId, 
        Rate,
        FDateTime 
from FTable f
where OId = 1413 and type = 'C'
  and FDateTime = (select Max(f2.FDateTime)
                   from FTable f2             
                   where f2.OId=f.Oid and f2.type = f.type)