Top Group By DB2

后端 未结 2 2015
情深已故
情深已故 2021-01-27 03:56

I\'ve been trying for hours but can\'t get the query to do what I want using DB2. From table Company and Users I have the following tickets quantity info per company/user

<
相关标签:
2条回答
  • 2021-01-27 04:26

    This should work. Create a derived view to calculate the Quantity per user and per company. Then get the max of then Quantity and then join the max back to the the calculation of the quantity.

    SELECT p.company, 
           t.user, 
           t.quantity 
    FROM   (SELECT MAX(t.quantity) max_quantity, 
                   t.company 
            FROM   (SELECT  
                           COUNT(t.user) quantity, 
                           t.company 
                    FROM   ticket t 
                    GROUP  BY t.company) t) maxq 
           INNER JOIN (SELECT t.user, 
                              t.company, 
                              COUNT(t.user) quantity 
                       FROM   ticket t 
                       GROUP  BY t.company, 
                                 t.user) t 
             ON maxq.max_quantity = t.quantity 
                AND maxq.company = t.company 
           INNER JOIN company p 
             ON p.company = t.company 
    ORDER  BY t.quantity DESC 
    

    A working sample that shows the top users by tag for the StackOverflow data can be found here.

    0 讨论(0)
  • 2021-01-27 04:29

    Build it up step by step.

    Find the maximum quantity for each company, assuming the first data table shown in the question is called 'Tickets':

    SELECT Company, MAX(Quantity) AS MaxQuantity
      FROM Tickets
     GROUP BY Company;
    

    Now, find the data for the user(s) with that maximum quantity for that company:

    SELECT T.User, T.Company, M.MaxQuantity
      FROM Tickets AS T
      JOIN (SELECT Company, MAX(Quantity) AS MaxQuantity
              FROM Tickets
             GROUP BY Company) AS M
        ON T.Company = M.Company AND T.Quantity = M.MaxQuantity;
    

    If the top quantity for a particular company was, say, 200 and two users both scored 200 for that company, then this query lists both users.

    Now, if you mean that the query you show in the question generates the first result table, then what I called tickets just above needs to be the derived table:

    SELECT T.User, COUNT(T.User) AS Quantity, T.Ccompany
      FROM Ticket AS T
     INNER JOIN Company AS P ON P.Company = T.Company 
     GROUP BY (T.User, T.Company)
     ORDER BY QUANTITY DESC 
    

    In which case, we can use a WITH clause (syntax unchecked, but I think it is correct per SQL standard):

    WITH Tickets AS
        (SELECT T.User, COUNT(T.User) AS Quantity, T.Ccompany
           FROM Ticket AS T
           JOIN Company AS P ON P.Company = T.Company 
          GROUP BY (T.User, T.Company)
        )
    SELECT T.User, T.Company, M.MaxQuantity
      FROM Tickets AS T
      JOIN (SELECT Company, MAX(Quantity) AS MaxQuantity
              FROM Tickets
             GROUP BY Company) AS M
        ON T.Company = M.Company AND T.Quantity = M.MaxQuantity;
    

    Clearly, you can also write the WITH sub-query out twice if you prefer.

    0 讨论(0)
提交回复
热议问题