2016-11-14 37 views
0

对不起,奇怪的标题我很难将问题转化为文字 但这是我面临的问题。所以这是我的表如果在显示cookieID并显示它属于bakkerID时获得最大值,则显示为

bakkery

BakkerID | CookieID 
---------+---------- 
    6534  1009 
    6534  1009 
    6534   50 
    1327   5 
    1327   8 
    1327   8 

,我试图让这个结果

bakkerID cookieID total 
------------------------- 
6534  1009  2 
1327   8  2 

所以我想算cookieID,并得到最大值,同时还坚持到cookieIDbakkerID。但我只想要最大的结果。

我通过一个子查询尝试过这种类似这样的

SELECT 
    MAX(cookie_count) AS total, 
    bakkerId, cookieID 
FROM 
    (SELECT 
     COUNT(cookieID) AS cookie_count, 
     bakkerId, cookieID 
    FROM 
     bakkery 
    GROUP BY 
     bakkerID, cookieID) AS cookie_counter_table 
GROUP BY 
    bakkerID, cookieID 

但结果将是

bakkerID cookieID total 
----------------------- 
6534  1009  2 
6534   50  1 
1327   8  2 
1327   5  1 

现在,这并不由因为该组的工作,但我也不能离开它否则,我会得到一个错误,它不在一个组中。我尝试使用的地方或有,但我可以导致重复bakkerID,我不想要。所以我的问题是:我该如何阻止显示出来的最大结果,或者我是否全都做错了?

回答

0

一种方法是使用row_number()和有条件聚集:

SELECT bakkerId, MAX(cookie_count), 
     MAX(CASE WHEN seqnum = 1 THEN cookieID END) as max_cookieId 
FROM (SELECT bakkerId, cookieID, COUNT(*) AS cookie_count, 
      ROW_NUMBER() OVER (PARTITION BY bakkerId ORDER BY COUNT(*) DESC) as seqnum 
     FROM bakkery 
     GROUP BY bakkerID, cookieID 
    ) bc 
GROUP BY bakkerId; 
+0

由于这是回答我的问题。不知道它是如何工作的,但现在让我知道。 –

0

您可以使用下面的代码:

SELECT BakkerID, 
     MaxCookieID CookieID, 
     SUM(CASE WHEN MaxCookieID = CookieID THEN 1 ELSE 0 END) total 
FROM ( SELECT *, 
       MAX(CookieID) OVER(PARTITION BY BakkerID) MaxCookieID 
     FROM dbo.bakkery) b 
GROUP BY BakkerID, 
     MaxCookieID; 
0

你可以试试这个:

select BakkerID,CookieID,total from 
          (
           SELECT COUNT(*) OVER (partition by bakkerid,cookieId) AS total, 
           ROW_NUMBER() over(partition by bakkerid order by cookieId desc) as rn, 
           bakkerId, 
           cookieID 
           FROM bakkery 
               ) x 
where x.rn=1 
order by BakkerID desc 
相关问题