首页 > 解决方案 > 如何使用 SQL 从另一个表中的一个表中查找第一个匹配结果?

问题描述

假设我有两张桌子:

Customer -
ID  | Name  | Etc
1   | One   |
2   | Two   |
3   | Three |
4   | Four  |
5   | Five  |
... | ...   |

Sales - 
Customer ID | Date | Amount
5           | 1/20 | $45
5           | 3/19 | $145
3           | 8/19 | $453
7           | 3/20 | $4513
3           | 9/20 | ...
1           | 3/20 | ...
1           | 1/20 | ...

我想做的是编写一个查询,为每个客户找到第一笔销售。我不确定该怎么做。我觉得这是按问题分组的,但答案并没有出现。

编辑:我觉得我的第一个数据表并没有完全解释我的问题。(老实说,在我编写解决方案之前,我什至没有意识到我的问题的这一方面) 注意:每次销售有多个客户。

Sales - 
Sale ID | Customer ID | Date | Amount
1       | 5           | 1/20 | $45
5       | 5           | 3/19 | $145
8       | 3           | 8/19 | $453
7       | 7           | 3/20 | $4513
3       | 4           | 9/20 | ...
2       | 1           | 3/20 | ...
1       | 1           | 1/20 | ...

标签: sqloraclegroup-bypartition

解决方案


您可以使用子查询为每个客户的每个销售分配一个行号,按日期升序排序,然后仅选择第一行:

SELECT "Customer ID", "Date", "Amount"
FROM (
  SELECT "Customer ID", "Date", "Amount",
         ROW_NUMBER() OVER (PARTITION BY "Customer ID" ORDER BY "Date") AS rn
  FROM Sales) s
WHERE rn = 1

SQLFiddle 上的演示


推荐阅读