繁体   English   中英

与MAX()和GROUP BY相关的子查询

[英]Correlated Subqueries with MAX() and GROUP BY

我在使用MAX()和GROUP BY时遇到问题。 我有下一张桌子:

personal_prizes

___________ ___________ _________ __________
|    id     |    userId |   specId| group    |  
|___________|___________|_________|__________|
|    1      |    1      |   1     |     1    |  
|___________|___________|_________|__________|
|    2      |    1      |   2     |     1    |  
|___________|___________|_________|__________|
|    3      |    2      |   3     |     1    |  
|___________|___________|_________|__________|
|     4     |    2      |   4     |     2    |  
|___________|___________|_________|__________|
|     5     |    1      |   5     |     2    |  
|___________|___________|_________|__________|
|     6     |    1      |   6     |     2    |  
|___________|___________|_________|__________|
|    7      |    2      |   7     |     3    |  
|___________|___________|_________|__________|


prizes
 ___________ ___________ _________ 
|    id     |    title  |   group |     
|___________|___________|_________|
|    1      |    First  |   1     | 
|___________|___________|_________|
|    2      |    Second |   1     | 
|___________|___________|_________|
|    3      |    Newby  |   1     | 
|___________|___________|_________|
|     4     |    General|   2     | 
|___________|___________|_________|
|     5     |    Leter  |   2     | 
|___________|___________|_________|
|     6     |    Ter    |   2     | 
|___________|___________|_________|
|     7     |    Mentor |   3     | 
|___________|___________|_________|

因此,我需要为用户选择最高的标题。 例如,id = 1的用户必须有奖品“第二”,“特”。 我不知道如何在一个查询中实现它((((首先,我尝试为用户选择最高的specID。我尝试下一个:

SELECT pp.specID 
FROM personal_prizes pp
WHERE pp.specID IN (SELECT MAX(pp1.id) 
                    FROM personal_prizes pp1
                    WHERE pp1.userId = 1 
                    GROUP BY pp1.group)

而且它不起作用。 所以请帮我解决这个问题。 而且,如果您帮助选择用户奖品,那就太好了!

我在这里看到的问题是,priests.id并不是确定哪个是“最高”奖品的可靠方法。 但是,忽略这一点,我建议使用ROW_NUMBER()OVER()来确定每个用户的“最高”奖赏,如下所示:

参考此SQL小提琴

CREATE TABLE personal_prizes
    ([id] int, [userId] int, [specId] int, [group] int)
;

INSERT INTO personal_prizes
    ([id], [userId], [specId], [group])
VALUES
    (1, 1, 1, 1),
    (2, 1, 2, 1),
    (3, 2, 3, 1),
    (4, 2, 4, 2),
    (5, 1, 5, 2),
    (6, 1, 6, 2),
    (7, 2, 7, 3)
;


CREATE TABLE prizes
    ([id] int, [title] varchar(7), [group] int)
;

INSERT INTO prizes
    ([id], [title], [group])
VALUES
    (1, 'First', 1),
    (2, 'Second', 1),
    (3, 'Newby', 1),
    (4, 'General', 2),
    (5, 'Leter', 2),
    (6, 'Ter', 2),
    (7, 'Mentor', 3)
;

查询1

select
*
from (
    select
      pp.*, p.title
    , row_number() over(partition by pp.userId order by p.id ASC) as prize_order
    from personal_prizes pp
    inner join prizes p on pp.specid = p.id
    ) d
where prize_order = 1

结果

| id | userId | specId | group | title | prize_order |
|----|--------|--------|-------|-------|-------------|
|  1 |      1 |      1 |     1 | First |           1 |
|  3 |      2 |      3 |     1 | Newby |           1 |

通过更改over子句中的ORDER BY,可以“反转”结果:

select
*
from (
    select
      pp.*, p.title
    , row_number() over(partition by pp.userId order by p.id DESC) as prize_order
    from personal_prizes pp
    inner join prizes p on pp.specid = p.id
    ) d
where prize_order = 1

| id | userId | specId | group |  title | prize_order |
|----|--------|--------|-------|--------|-------------|
|  6 |      1 |      6 |     2 |    Ter |           1 |
|  7 |      2 |      7 |     3 | Mentor |           1 |

您可以扩展此逻辑以定位“每组最高奖”

select
*
from (
    select
      pp.*, p.title
    , row_number() over(partition by pp.userId, p.[group] order by p.id ASC) as prize_order
    from personal_prizes pp
    inner join prizes p on pp.specid = p.id
    ) d
where prize_order = 1


| id | userId | specId | group |   title | prize_order |
|----|--------|--------|-------|---------|-------------|
|  1 |      1 |      1 |     1 |   First |           1 |
|  5 |      1 |      5 |     2 |   Leter |           1 |
|  3 |      2 |      3 |     1 |   Newby |           1 |
|  4 |      2 |      4 |     2 | General |           1 |
|  7 |      2 |      7 |     3 |  Mentor |           1 |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM