HOW TO:SQL Server根据其他字段中的最大值选择不同的字段

时间:2012-09-24 18:29:49

标签: sql sql-server distinct max

id   tmpname      date_used        tkt_nr
---|---------|------------------|--------|
1  | template| 04/03/2009 16:10 | 00011  |
2  | templat1| 04/03/2009 16:11 | 00011  |
5  | templat2| 04/03/2009 16:12 | 00011  |
3  | diffname| 03/03/2009 15:11 | 00022  |
4  | diffname| 03/03/2009 16:12 | 00022  |
6  | another | 03/03/2009 16:13 | NULL   |
7  | somethin| 24/12/2008 11:12 | 00023  |
8  | name    | 01/01/2009 12:12 | 00026  |

我想得到结果:

id   tmpname      date_used        tkt_nr
---|---------|------------------|--------|
5  | templat2| 04/03/2009 16:12 | 00011  |
4  | diffname| 03/03/2009 16:12 | 00022  |
7  | somethin| 24/12/2008 11:12 | 00023  |
8  | name    | 01/01/2009 12:12 | 00026  |

所以我正在寻找的是根据日期时间的最大值,将不同的tkt_nr值排除在NULL之外。

我尝试了几种选择,但总是失败

SELECT *
FROM  templateFeedback a 
JOIN (
      SELECT ticket_number, MAX(date_used) date_used
      FROM   templateFeedback
      GROUP BY ticket_number
     ) b 
ON a.ticket_number = b.ticket_number AND a.date_used = b.date_used

我将不胜感激任何帮助。不幸的是,我需要代码与SQL Server兼容。

1 个答案:

答案 0 :(得分:3)

因为我发现了窗口函数,所以我已经停止了这种方式。通常,有两个具有相同时间戳的记录,我在结果集中得到两个记录。这是tSQL的代码。与Oracle类似。我认为mySQL还不支持这个。

Select id, tmpname, date_used, tkt_nbr
From 
(
    Select id, tmpname, date_used, tkt_nbr,
        rownum = Row_Number() Over (Partition by tkt_nbr Order by date_used desc)
) x
Where row_num=1