sql获取多个结果的最大值

时间:2013-12-04 19:09:27

标签: sql sql-server sql-server-2008

在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

我只希望显示第一个或最上一个,但最好按字母顺序显示。

2 个答案:

答案 0 :(得分:1)

我通过几个CTE做这样的事情。一个人会为每个客户提供max(locationcount),而且只为每个客户添加一个row_number(),以便我们可以选择“第一个”位置。

SQL Fiddle

这有点像黑客,但它确实有效。

;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子句的更多信息: