在SQL Server 2008 R2中,如果有两行具有相同的值,如何获得MAX结果?我有一个表,用于存储有关在某个位置看到客户端的次数的数据。
create table #templocation
(
ClientID Int,
Location Varchar(100),
LocationCount Int,
MaxCount Int
)
我只使用insert语句填充前三列,然后我得到每个客户端的最大值,如下所示:
update t
set t.MaxCount = t2.locationcount
from #templocation t
join (select tl.ClientID, MAX(tl.LocationCount) as 'locationcount'
from #templocation tl
group by tl.ClientID) t2
on t2.ClientID = t.ClientID
update t
set t.PrimaryLocation = tl.Location
from #temp t
join #templocation tl
on t.ClientId = tl.ClientID
where tl.LocationCount = tl.MaxCount
然后我将其加入主表以获得最终结果。我的问题是,如果客户端有两个或更多的最大计数。然后它想显示所有最大位置,如下所示:
ClientId Location LocationCount
12502 Main St. 4
12502 Lake Ave 4
12502 Tracy Rd 2
我得到的结果是:
ClientId ClientName Location
12502 John Smith Main St.
12502 John Smith Lake Ave
我只希望显示第一个或最上一个,但最好按字母顺序显示。
答案 0 :(得分:1)
我通过几个CTE做这样的事情。一个人会为每个客户提供max(locationcount)
,而且只为每个客户添加一个row_number()
,以便我们可以选择“第一个”位置。
这有点像黑客,但它确实有效。
;with maxrows as
(select
ClientID as ClientID,
max(LocationCount) as MaxValue
--row_number() OVER (partition by ClientID order by ClientID)
from
table1
group by ClientID)
,
rowcounts as
(
select
t1.ClientID,
t1.Location,
row_number() over (PARTITION BY t1.ClientID order by t1.Location) as RowNum
from
table1 t1
)
select
t2.ClientID,
t2.Location
from
maxrows t1
inner join rowcounts t2
on t1.ClientID = t2.ClientID
and t2.rownum = 1
答案 1 :(得分:0)
根据我对此问题的理解,您可以使用MAX() OVER ()
来达到您想要的效果:
WITH maxvalues AS (
SELECT
ClientId,
Location,
LocationCount,
MaxCount = MAX(LocationCount) OVER (PARTITION BY ClientId)
FROM atable
)
SELECT
ClientId,
Location
FROM maxvalues
WHERE LocationCount = MaxCount
;
将maxvalues
加入到包含客户名称的任何表中,以便将这些名称包含在输出中。
了解有关本手册中OVER子句的更多信息: