【发布时间】:2013-07-14 23:23:50
【问题描述】:
我在处理这个 SQL 查询时遇到了一些问题,首先是一些背景知识
表定义
create table [owner]
(
[patientid] nvarchar(10) NOT NULL,
[clientid] nvarchar(10) NOT NULL,
[percentage] float NULL,
[status] bit NOT NULL
)
alter table [owner] ADD CONSTRAINT PK_OWNER PRIMARY KEY CLUSTERED ([patientid],[clientid])
示例源数据
|患者 ID |客户 ID |百分比 |状态 | ---------------------------------------------- |宠物1 |所有者1 | 100 | 1 | |宠物2 |所有者2 | 75 | 1 | |宠物2 |所有者3 | 25 | 1 | |宠物3 |所有者4 | 10 | 1 | |宠物3 |所有者5 | 90 | 1 | |宠物3 |所有者6 | 100 | 0 | |宠物4 |所有者7 | 50 | 1 | |宠物4 |所有者8 | 50 | 1 |我正在寻找的是,我希望拥有最高百分比的宠物拥有1 状态的主人,如果出现平局,它应该按主人姓名的字母顺序排列。
这是我想看到的输出
|患者 ID |客户 ID | ---------------------- |宠物1 |所有者1 | |宠物2 |所有者2 | |宠物3 |所有者5 | |宠物4 |所有者7 |我得到的最接近的是
SELECT f1.[patientid]
,f1.[clientid]
FROM [OWNER] f1
inner join
(
select [patientid], max([percentage]) as [percentage]
from [owner]
where status = 1
group by [patientid]
) f2 on f1.[patientid] = f2.[patientid] and f1.[percentage] = f2.[percentage]
where status = 1
但是,这给了我两个 Pet4 的记录。
处理这样的事情的正确方法是什么,所以我只得到一条记录,然后我在领带上应用字母顺序来找到一条记录?
这里是SQL Fiddle workspace,可以尝试任何答案。
编辑:
我想出了一个办法,但对我来说它有一股代码味道,有没有更“正确”的方法来做到这一点?
select distinct f3.[patientid], (
SELECT top 1 f1.[clientid]
FROM [OWNER] f1
inner join
(
select [patientid], max([percentage]) as [percentage]
from [owner]
where status = 1
group by [patientid]
) f2 on f1.[patientid] = f2.[patientid] and f1.[percentage] = f2.[percentage]
where status = 1 and f1.[patientid] = f3.[patientid]
order by f1.[patientid], f1.[clientid]
)
from owner f3
【问题讨论】:
-
bluefeet 的解决方案更好:服务器将只读取一次行。对于上述解决方案,服务器将读取行两到三遍:
f1、f2、f3。
标签: sql sql-server sql-server-2005 group-by