簡體   English   中英

如何使用 SQL 從另一個表中的一個表中找到第一個匹配結果?

[英]How to use SQL find first matching result from one table in another table?

假設我有兩張桌子:

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 | ...

您可以使用子查詢為每個客戶的每次銷售分配一個行號,按日期升序排序,然后 select 僅第一行:

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 上的演示

Nick 的解決方案可能是性能最高的,但如果你想在這里使用GROUP BY ,你可以這樣做:

SELECT
    c.ID,
    c.Name,
    s1.Date,
    s1.Amount
FROM Customer c
INNER JOIN Sales s1 ON c.ID = s1."Customer ID"
INNER JOIN
(
    SELECT "Customer ID", MIN(Date) AS FirstSaleDate
    FROM Sales
    GROUP BY "Customer ID"
) s2
    ON s1."Customer ID" = s2."Customer ID" AND
       s1.Date = s2.FirstSaleDate
ORDER BY
    c.ID,
    c.Name;

在 Oracle 中,您可以使用keep

select customer_id, min(date) as first_sales_date,
       max(amount) keep (dense_rank first order by date asc) as first_amount
from sales
group by customer_id;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM