SQL聚合使用DISTINCT对ID的最新日期

时间:2016-12-20 22:37:00

标签: sql sql-server select

请求 我在下面有一部分数据,我的目标是将代理列限制为仅包含唯一值,其中所选的唯一值是它被修改的最新日期。

现有数据

modified     agent  rank 
2016-10-18  346502  0   
2013-06-04  346502  41  
2011-10-31  346503  0   
2012-08-13  346505  0   
2016-04-18  346506  66  
2015-01-27  346506  1   
2016-01-21  346507  103 
2015-01-27  346507  130 
2012-01-30  346508  0   

尝试使用此回答https://stackoverflow.com/a/29912858/461887作为基础,但无法正确汇总它。

SQL无效

SELECT DISTINCT
  FLiex.agtprof.modify_date_time
  ,FLiex.agtprof.agent_id
  ,FLiex.agtprof.rank
  ,FLiex.agtprof.external_id
WHERE
    FLiex.agtprof.modify_date_time = MAX( FLiex.agtprof.modify_date_time)
FROM
  FLiex.agtprof

所需输出

modify  agent   rank
18/10/2016  346502  0
18/04/2016  346506  66
21/01/2016  346507  103
13/08/2012  346505  0
30/01/2012  346508  0
31/10/2011  346503  0

3 个答案:

答案 0 :(得分:4)

您尝试获取单行数据,但基于其他行。虽然这可以通过聚合函数实现,但使用窗口(分析)函数更容易:

const lookupValue = "stream";
const testString1 = "I might contain the word StReAm and it might be capitalized any way.";
const testString2 = "I might contain the word steam and it might be capitalized any way.";

function testString(testData, lookup){
  return testData.toLowerCase().indexOf(lookup) === -1;
}

function prettyPrint(yesNo){
   return "The string does" + (yesNo ? " NOT" : "") + " contain \"stream\" in some form."
}

console.log(prettyPrint(testString(testString1, lookupValue)));
console.log(prettyPrint(testString(testString2, lookupValue)));

答案 1 :(得分:1)

SELECT DISTINCT max(id_date), agent, rank, id
FROM fliex.agtprof
GROUP BY 2,3,4;

试试这个。我想如果你选择max id_date然后按其余分组,你应该得到你正在寻找的结果。

答案 2 :(得分:1)

试试这个:

SELECT 
    FLiex.agtprof.modify_date_time
    ,FLiex.agtprof.agent_id
    ,FLiex.agtprof.rank
    ,FLiex.agtprof.external_id
FROM
    FLiex.agtprof
INNER JOIN (
    SELECT 
        Max(FLiex.agtprof.modify_date_time) as max_mod_date_time
        ,FLiex.agtprof.agent_id as agent_id
    FROM
        FLiex.agtprof
    GROUP BY FLiex.agtprof.agent_id
    ) Filter
    ON FLiex.agtprof.agentID = Filter.agent_id
    AND FLiex.agtprof.modify_date_time = Filter.max_mod_date_time