我在使用这个 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
。
| 患者 ID | 客户 ID | ---------------------- | 宠物1 | 所有者1 | | 宠物2 | 所有者2 | | 宠物3 | 所有者5 | | 宠物4 | 所有者7 | | 宠物4 | 所有者8 |
处理这样的事情的正确方法是什么,所以我只得到一条记录,然后在领带上应用字母顺序来找到一条记录?
这是一个用于尝试任何答案的SQL Fiddle 工作区。
编辑:
我想出了一种方法来做到这一点,但对我来说它散发着代码气味,有没有更“正确”的方法来做到这一点?
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