SQL Server选择不同的最新值

时间:2013-06-06 15:41:33

标签: sql-server-2005 select join distinct

我的桌子有很多行(> 10K)。大多数行都有与用户名相关联的重复角色值。

我要做的是按 request_id 添加的不同AND最新角色选择行。 我几乎拥有它,但是我的尾巴部分是 request_id 字段中有null个值,因为这些请求是在添加该列之前发出的。我仍然需要将它们包含在select statement中,以防用户自更新后未输入其他请求。

这是我的表结构示例:

 id | uname  | role    | request_id
 0  | jsmith  | User   | null
 1  | jsmith  | Admin   | null
 2  | jsmith  | Dude    | null
 3  | jsmith  | Admin   | 56
 4  | jsmith  | Dude    | 56
 5  | jsmith  | Admin   | 57
 6  | jsmith  | Dude    | 57

这将是理想的结果:

0  | jsmith  | User    | null
5  | jsmith  | Admin   | 57
6  | jsmith  | Dude    | 57

以下是我到目前为止所做的陈述:

加入

select distinct a.uname, a.role, a.request_id from (
    select * from  das_table 
    ) 
b join das_table a on b.role = a.role and b.request_id = a.request_id
where a.uname = 'jsmith'

结果:这消除了 request_id = NULL

的行

MAX()

这对我不起作用我猜是因为MAX()不计算null值?

select distinct uname, role, max(request_id) as request_id from das_table where uname='jsmith'
group by uname, role, request_id

我看过类似的问题:

在我的问题中,我认为与我研究的其他人不同的一个警告是request_id有可能为空。

Select distinct values from 1 column | SQL Server : select distinct by one column and by another column value | SQL Server select distinct hell

2 个答案:

答案 0 :(得分:12)

max查询无效,因为您在分组中添加了request_id - 请尝试:

select distinct uname, role, max(request_id) as request_id 
from das_table where uname='jsmith'
group by uname, role

SQLFiddle here

答案 1 :(得分:1)

似乎ISNULL会解决您的问题,我在这里使用1是为了简单,但如果对您的使用更有意义,可以使用-1。

MAX(ISNULL(request_id, 1))