Sql 组合分区方式和分组方式

Sql 组合分区方式和分组方式,sql,sql-server,Sql,Sql Server,我有一个mssql表,如下所示: +----+----------+---------+--------+--------+ | id | username | date | scoreA | scoreB | +----+----------+---------+--------+--------+ | 1 | jim | 01/2020 | 100 | 0 | | 2 | max | 01/2020 | 0 | 200 | |

我有一个mssql表,如下所示:

+----+----------+---------+--------+--------+
| id | username |  date   | scoreA | scoreB |
+----+----------+---------+--------+--------+
|  1 | jim      | 01/2020 |    100 |      0 |
|  2 | max      | 01/2020 |      0 |    200 |
|  3 | jim      | 01/2020 |      0 |    150 |
|  4 | max      | 02/2020 |    150 |      0 |
|  5 | jim      | 02/2020 |      0 |    300 |
|  6 | lee      | 02/2020 |    100 |      0 |
|  7 | max      | 02/2020 |      0 |    200 |
+----+----------+---------+--------+--------+
+----------+---------+--------------------------------------------+
| username |  date   | combined_score (max(scoreA) + max(scoreB)) |
+----------+---------+--------------------------------------------+
| jim      | 01/2020 |                                        250 |
| max      | 02/2020 |                                        350 |
+----------+---------+--------------------------------------------+
SELECT  
username, (max(scoreA) + max(scoreB)) AS combined_score,
FROM score_table
GROUP BY username
ORDER BY combined_score DESC
SELECT * 
FROM
(SELECT t.*, row_number() OVER (PARTITION BY date ORDER BY scoreA DESC) rn
FROM score_table t) as tmp
WHERE tmp.rn = 1
ORDER BY date
SELECT s.*
FROM (SELECT username, date, (max(scoreA) + max(scoreB)) AS combined_score,
             ROW_NUMBER() OVER (PARTITION BY date ORDER BY max(scoreA) + max(scoreB) DESC) as seqnum
      FROM score_table
      GROUP BY username, date
     ) s
ORDER BY combined_score DESC;
我需要的是每次约会都能得到最好的综合分数。对于综合得分,我指的是每个用户和每个总结日期的最佳得分 结果应该如下所示:

+----+----------+---------+--------+--------+
| id | username |  date   | scoreA | scoreB |
+----+----------+---------+--------+--------+
|  1 | jim      | 01/2020 |    100 |      0 |
|  2 | max      | 01/2020 |      0 |    200 |
|  3 | jim      | 01/2020 |      0 |    150 |
|  4 | max      | 02/2020 |    150 |      0 |
|  5 | jim      | 02/2020 |      0 |    300 |
|  6 | lee      | 02/2020 |    100 |      0 |
|  7 | max      | 02/2020 |      0 |    200 |
+----+----------+---------+--------+--------+
+----------+---------+--------------------------------------------+
| username |  date   | combined_score (max(scoreA) + max(scoreB)) |
+----------+---------+--------------------------------------------+
| jim      | 01/2020 |                                        250 |
| max      | 02/2020 |                                        350 |
+----------+---------+--------------------------------------------+
SELECT  
username, (max(scoreA) + max(scoreB)) AS combined_score,
FROM score_table
GROUP BY username
ORDER BY combined_score DESC
SELECT * 
FROM
(SELECT t.*, row_number() OVER (PARTITION BY date ORDER BY scoreA DESC) rn
FROM score_table t) as tmp
WHERE tmp.rn = 1
ORDER BY date
SELECT s.*
FROM (SELECT username, date, (max(scoreA) + max(scoreB)) AS combined_score,
             ROW_NUMBER() OVER (PARTITION BY date ORDER BY max(scoreA) + max(scoreB) DESC) as seqnum
      FROM score_table
      GROUP BY username, date
     ) s
ORDER BY combined_score DESC;
我走了这么远: 我可以按用户将分数分组,如下所示:

+----+----------+---------+--------+--------+
| id | username |  date   | scoreA | scoreB |
+----+----------+---------+--------+--------+
|  1 | jim      | 01/2020 |    100 |      0 |
|  2 | max      | 01/2020 |      0 |    200 |
|  3 | jim      | 01/2020 |      0 |    150 |
|  4 | max      | 02/2020 |    150 |      0 |
|  5 | jim      | 02/2020 |      0 |    300 |
|  6 | lee      | 02/2020 |    100 |      0 |
|  7 | max      | 02/2020 |      0 |    200 |
+----+----------+---------+--------+--------+
+----------+---------+--------------------------------------------+
| username |  date   | combined_score (max(scoreA) + max(scoreB)) |
+----------+---------+--------------------------------------------+
| jim      | 01/2020 |                                        250 |
| max      | 02/2020 |                                        350 |
+----------+---------+--------------------------------------------+
SELECT  
username, (max(scoreA) + max(scoreB)) AS combined_score,
FROM score_table
GROUP BY username
ORDER BY combined_score DESC
SELECT * 
FROM
(SELECT t.*, row_number() OVER (PARTITION BY date ORDER BY scoreA DESC) rn
FROM score_table t) as tmp
WHERE tmp.rn = 1
ORDER BY date
SELECT s.*
FROM (SELECT username, date, (max(scoreA) + max(scoreB)) AS combined_score,
             ROW_NUMBER() OVER (PARTITION BY date ORDER BY max(scoreA) + max(scoreB) DESC) as seqnum
      FROM score_table
      GROUP BY username, date
     ) s
ORDER BY combined_score DESC;
我可以通过如下方式获得每个日期的最佳分数:

+----+----------+---------+--------+--------+
| id | username |  date   | scoreA | scoreB |
+----+----------+---------+--------+--------+
|  1 | jim      | 01/2020 |    100 |      0 |
|  2 | max      | 01/2020 |      0 |    200 |
|  3 | jim      | 01/2020 |      0 |    150 |
|  4 | max      | 02/2020 |    150 |      0 |
|  5 | jim      | 02/2020 |      0 |    300 |
|  6 | lee      | 02/2020 |    100 |      0 |
|  7 | max      | 02/2020 |      0 |    200 |
+----+----------+---------+--------+--------+
+----------+---------+--------------------------------------------+
| username |  date   | combined_score (max(scoreA) + max(scoreB)) |
+----------+---------+--------------------------------------------+
| jim      | 01/2020 |                                        250 |
| max      | 02/2020 |                                        350 |
+----------+---------+--------------------------------------------+
SELECT  
username, (max(scoreA) + max(scoreB)) AS combined_score,
FROM score_table
GROUP BY username
ORDER BY combined_score DESC
SELECT * 
FROM
(SELECT t.*, row_number() OVER (PARTITION BY date ORDER BY scoreA DESC) rn
FROM score_table t) as tmp
WHERE tmp.rn = 1
ORDER BY date
SELECT s.*
FROM (SELECT username, date, (max(scoreA) + max(scoreB)) AS combined_score,
             ROW_NUMBER() OVER (PARTITION BY date ORDER BY max(scoreA) + max(scoreB) DESC) as seqnum
      FROM score_table
      GROUP BY username, date
     ) s
ORDER BY combined_score DESC;
有没有一种合适的方法来组合这些语句并得到我需要的结果?谢谢大家!


顺便说一句,不要在意可能的关系

您可以像这样组合窗口函数和聚合函数:

+----+----------+---------+--------+--------+
| id | username |  date   | scoreA | scoreB |
+----+----------+---------+--------+--------+
|  1 | jim      | 01/2020 |    100 |      0 |
|  2 | max      | 01/2020 |      0 |    200 |
|  3 | jim      | 01/2020 |      0 |    150 |
|  4 | max      | 02/2020 |    150 |      0 |
|  5 | jim      | 02/2020 |      0 |    300 |
|  6 | lee      | 02/2020 |    100 |      0 |
|  7 | max      | 02/2020 |      0 |    200 |
+----+----------+---------+--------+--------+
+----------+---------+--------------------------------------------+
| username |  date   | combined_score (max(scoreA) + max(scoreB)) |
+----------+---------+--------------------------------------------+
| jim      | 01/2020 |                                        250 |
| max      | 02/2020 |                                        350 |
+----------+---------+--------------------------------------------+
SELECT  
username, (max(scoreA) + max(scoreB)) AS combined_score,
FROM score_table
GROUP BY username
ORDER BY combined_score DESC
SELECT * 
FROM
(SELECT t.*, row_number() OVER (PARTITION BY date ORDER BY scoreA DESC) rn
FROM score_table t) as tmp
WHERE tmp.rn = 1
ORDER BY date
SELECT s.*
FROM (SELECT username, date, (max(scoreA) + max(scoreB)) AS combined_score,
             ROW_NUMBER() OVER (PARTITION BY date ORDER BY max(scoreA) + max(scoreB) DESC) as seqnum
      FROM score_table
      GROUP BY username, date
     ) s
ORDER BY combined_score DESC;

请注意,日期需要是聚合的一部分。

您可以将窗口函数和聚合函数组合在一起,如下所示:

+----+----------+---------+--------+--------+
| id | username |  date   | scoreA | scoreB |
+----+----------+---------+--------+--------+
|  1 | jim      | 01/2020 |    100 |      0 |
|  2 | max      | 01/2020 |      0 |    200 |
|  3 | jim      | 01/2020 |      0 |    150 |
|  4 | max      | 02/2020 |    150 |      0 |
|  5 | jim      | 02/2020 |      0 |    300 |
|  6 | lee      | 02/2020 |    100 |      0 |
|  7 | max      | 02/2020 |      0 |    200 |
+----+----------+---------+--------+--------+
+----------+---------+--------------------------------------------+
| username |  date   | combined_score (max(scoreA) + max(scoreB)) |
+----------+---------+--------------------------------------------+
| jim      | 01/2020 |                                        250 |
| max      | 02/2020 |                                        350 |
+----------+---------+--------------------------------------------+
SELECT  
username, (max(scoreA) + max(scoreB)) AS combined_score,
FROM score_table
GROUP BY username
ORDER BY combined_score DESC
SELECT * 
FROM
(SELECT t.*, row_number() OVER (PARTITION BY date ORDER BY scoreA DESC) rn
FROM score_table t) as tmp
WHERE tmp.rn = 1
ORDER BY date
SELECT s.*
FROM (SELECT username, date, (max(scoreA) + max(scoreB)) AS combined_score,
             ROW_NUMBER() OVER (PARTITION BY date ORDER BY max(scoreA) + max(scoreB) DESC) as seqnum
      FROM score_table
      GROUP BY username, date
     ) s
ORDER BY combined_score DESC;

请注意,日期必须是聚合的一部分。

我投了更高的票,因为你有一个非常好的问题,其中有你所做的示例。干得好我投了更高的票,因为你有一个结构非常好的问题,并举例说明你做了什么。干得好