如何获取列的 n 个不同值的行
How to get rows for n distinct values of a column
我需要获取 n 个不同发票编号的行。
我有 SELECT 查询,它给出了来自 table:
的结果
SELECT A.INVOICE_NUMBER, A.INVOICE_SEQ_NUMBER, B.FILE_NUMBER
FROM TABLE1 AS A, TABLE2 AS B
WHERE A.INVOICE_NUMBER = B.INVOICE_NUMBER
AND A.INVOICE_SEQ_NUMBER = B.INVOICE_SEQ_NUMBER
所以我的查询结果是这样的:
-----------------------------------------------------
| INVOICE_NUMBER | INVOICE_SEQ_NUMBER | FILE_NUMBER |
------------------------------------------------------
|1111111111-1 | 1 | P4324324525 |
-----------------------------------------------------
|1111111111-1 | 2 | P4565674574 |
-----------------------------------------------------
|1111111111-1 | 3 | V4324552557 |
-----------------------------------------------------
|1111111111-1 | 4 | V4324552525 |
-----------------------------------------------------
|2222222222-2 | 1 | S4563636574 |
-----------------------------------------------------
|3333333333-3 | 1 | Q4324325675 |
-----------------------------------------------------
|3333333333-3 | 2 | Q4565674574 |
-----------------------------------------------------
|4444444444-4 | 1 | F4326364366 |
-----------------------------------------------------
|4444444444-4 | 2 | F4565636323 |
-----------------------------------------------------
|4444444444-4 | 3 | F4398798588 |
-----------------------------------------------------
|4444444444-4 | 4 | F4565865888 |
-----------------------------------------------------
但我需要的是,例如,只获取三个不同发票号的结果,所以我的查询应该给出:
-----------------------------------------------------
| INVOICE_NUMBER | INVOICE_SEQ_NUMBER | FILE_NUMBER |
------------------------------------------------------
|1111111111-1 | 1 | P4324324525 |
-----------------------------------------------------
|1111111111-1 | 2 | P4565674574 |
-----------------------------------------------------
|1111111111-1 | 3 | V4324552557 |
-----------------------------------------------------
|1111111111-1 | 4 | V4324552525 |
-----------------------------------------------------
|2222222222-2 | 1 | S4563636574 |
-----------------------------------------------------
|3333333333-3 | 1 | Q4324325675 |
-----------------------------------------------------
|3333333333-3 | 2 | Q4565674574 |
-----------------------------------------------------
如何实现?
你听说过JOIN
吗?
无论如何,解决问题的一种方法是使用 DENSE_RANK()
:
SELECT INVOICE_NUMBER, INVOICE_SEQ_NUMBER, FILE_NUMBER
FROM (SELECT A.INVOICE_NUMBER, A.INVOICE_SEQ_NUMBER, B.FILE_NUMBER,
DENSE_RANK() OVER (ORDER BY A.INVOICE_NUMBER) as seqnum
FROM TABLE1 A JOIN
TABLE2 B
ON A.INVOICE_NUMBER = B.INVOICE_NUMBER AND
A.INVOICE_SEQ_NUMBER = B.INVOICE_SEQ_NUMBER
) t
WHERE seqnum <= 3;
我需要获取 n 个不同发票编号的行。
我有 SELECT 查询,它给出了来自 table:
的结果SELECT A.INVOICE_NUMBER, A.INVOICE_SEQ_NUMBER, B.FILE_NUMBER
FROM TABLE1 AS A, TABLE2 AS B
WHERE A.INVOICE_NUMBER = B.INVOICE_NUMBER
AND A.INVOICE_SEQ_NUMBER = B.INVOICE_SEQ_NUMBER
所以我的查询结果是这样的:
-----------------------------------------------------
| INVOICE_NUMBER | INVOICE_SEQ_NUMBER | FILE_NUMBER |
------------------------------------------------------
|1111111111-1 | 1 | P4324324525 |
-----------------------------------------------------
|1111111111-1 | 2 | P4565674574 |
-----------------------------------------------------
|1111111111-1 | 3 | V4324552557 |
-----------------------------------------------------
|1111111111-1 | 4 | V4324552525 |
-----------------------------------------------------
|2222222222-2 | 1 | S4563636574 |
-----------------------------------------------------
|3333333333-3 | 1 | Q4324325675 |
-----------------------------------------------------
|3333333333-3 | 2 | Q4565674574 |
-----------------------------------------------------
|4444444444-4 | 1 | F4326364366 |
-----------------------------------------------------
|4444444444-4 | 2 | F4565636323 |
-----------------------------------------------------
|4444444444-4 | 3 | F4398798588 |
-----------------------------------------------------
|4444444444-4 | 4 | F4565865888 |
-----------------------------------------------------
但我需要的是,例如,只获取三个不同发票号的结果,所以我的查询应该给出:
-----------------------------------------------------
| INVOICE_NUMBER | INVOICE_SEQ_NUMBER | FILE_NUMBER |
------------------------------------------------------
|1111111111-1 | 1 | P4324324525 |
-----------------------------------------------------
|1111111111-1 | 2 | P4565674574 |
-----------------------------------------------------
|1111111111-1 | 3 | V4324552557 |
-----------------------------------------------------
|1111111111-1 | 4 | V4324552525 |
-----------------------------------------------------
|2222222222-2 | 1 | S4563636574 |
-----------------------------------------------------
|3333333333-3 | 1 | Q4324325675 |
-----------------------------------------------------
|3333333333-3 | 2 | Q4565674574 |
-----------------------------------------------------
如何实现?
你听说过JOIN
吗?
无论如何,解决问题的一种方法是使用 DENSE_RANK()
:
SELECT INVOICE_NUMBER, INVOICE_SEQ_NUMBER, FILE_NUMBER
FROM (SELECT A.INVOICE_NUMBER, A.INVOICE_SEQ_NUMBER, B.FILE_NUMBER,
DENSE_RANK() OVER (ORDER BY A.INVOICE_NUMBER) as seqnum
FROM TABLE1 A JOIN
TABLE2 B
ON A.INVOICE_NUMBER = B.INVOICE_NUMBER AND
A.INVOICE_SEQ_NUMBER = B.INVOICE_SEQ_NUMBER
) t
WHERE seqnum <= 3;