SQL 仅获取重复行中较早的日期
SQL get only earlier date in repetitive rows
我有一个 SQL table 包含这样的交易
ID | FK | STATUS | DATE
1 | A | K1 | 2021-01-01
2 | A | K1 | 2021-01-15
3 | A | K2 | 2021-01-30
4 | A | K2 | 2021-02-03
5 | B | K1 | 2021-01-12
6 | C | K1 | 2021-03-30
7 | C | K3 | 2021-09-15
我们可以看到,一些FK有一些不同STATUS和不同DATE的记录。我想从每个 FK 获得状态为 K1 的 first/earlier 交易日期。
也许是这样的。
ID | FK | STATUS | DATE
1 | A | K1 | 2021-01-01
5 | B | K1 | 2021-01-12
6 | C | K1 | 2021-03-30
我怎样才能得到这样的结果?
注意:我使用的是 MariaDB 版本 10.5.9-MariaDB
CREATE TABLE my_table (
`ID` INTEGER,
`FK` VARCHAR(1),
`STATUS` VARCHAR(2),
`DATE` DATETIME
);
INSERT INTO my_table
(`ID`, `FK`, `STATUS`, `DATE`)
VALUES
('1', 'A', 'K1', '2021-01-01'),
('2', 'A', 'K1', '2021-01-15'),
('3', 'A', 'K2', '2021-01-30'),
('4', 'A', 'K2', '2021-02-03'),
('5', 'B', 'K1', '2021-01-12'),
('6', 'C', 'K1', '2021-03-30'),
('7', 'C', 'K3', '2021-09-15');
查询#1
SELECT
ID,
FK,
STATUS,
DATE
FROM (
SELECT
*,
row_number() over (partition by FK,STATUS order by DATE ASC) rn from my_table
) t
where STATUS='K1' and rn=1;
ID
FK
STATUS
DATE
1
A
K1
2021-01-01 00:00:00
5
B
K1
2021-01-12 00:00:00
6
C
K1
2021-03-30 00:00:00
WITH cte_customers AS (
SELECT
ROW_NUMBER() OVER(PARTITION BY fk,status
ORDER BY
date
) row_num,
customer_id,
fk,
status
FROM
sales.customers
) SELECT
*
FROM
cte_customers
WHERE
row_num =1;
这可以通过 windowing function:
解决
WITH RowNumbers AS (
SELECT *,
row_number() OVER (PARTITION BY FK ORDER BY Date) As rn
FROM [MyTable]
WHERE Status = 'K1'
)
SELECT ID, FK, STATUS, DATE
FROM RowNumbers
WHERE rn = 1
Window 功能已添加到 MariaDB 10.2 版中。还需要 CTE,因为 row_number() 直到 在 处理 WHERE 子句后才会计算。
我有一个 SQL table 包含这样的交易
ID | FK | STATUS | DATE
1 | A | K1 | 2021-01-01
2 | A | K1 | 2021-01-15
3 | A | K2 | 2021-01-30
4 | A | K2 | 2021-02-03
5 | B | K1 | 2021-01-12
6 | C | K1 | 2021-03-30
7 | C | K3 | 2021-09-15
我们可以看到,一些FK有一些不同STATUS和不同DATE的记录。我想从每个 FK 获得状态为 K1 的 first/earlier 交易日期。
也许是这样的。
ID | FK | STATUS | DATE
1 | A | K1 | 2021-01-01
5 | B | K1 | 2021-01-12
6 | C | K1 | 2021-03-30
我怎样才能得到这样的结果?
注意:我使用的是 MariaDB 版本 10.5.9-MariaDB
CREATE TABLE my_table (
`ID` INTEGER,
`FK` VARCHAR(1),
`STATUS` VARCHAR(2),
`DATE` DATETIME
);
INSERT INTO my_table
(`ID`, `FK`, `STATUS`, `DATE`)
VALUES
('1', 'A', 'K1', '2021-01-01'),
('2', 'A', 'K1', '2021-01-15'),
('3', 'A', 'K2', '2021-01-30'),
('4', 'A', 'K2', '2021-02-03'),
('5', 'B', 'K1', '2021-01-12'),
('6', 'C', 'K1', '2021-03-30'),
('7', 'C', 'K3', '2021-09-15');
查询#1
SELECT
ID,
FK,
STATUS,
DATE
FROM (
SELECT
*,
row_number() over (partition by FK,STATUS order by DATE ASC) rn from my_table
) t
where STATUS='K1' and rn=1;
ID | FK | STATUS | DATE |
---|---|---|---|
1 | A | K1 | 2021-01-01 00:00:00 |
5 | B | K1 | 2021-01-12 00:00:00 |
6 | C | K1 | 2021-03-30 00:00:00 |
WITH cte_customers AS (
SELECT
ROW_NUMBER() OVER(PARTITION BY fk,status
ORDER BY
date
) row_num,
customer_id,
fk,
status
FROM
sales.customers
) SELECT
*
FROM
cte_customers
WHERE
row_num =1;
这可以通过 windowing function:
解决WITH RowNumbers AS (
SELECT *,
row_number() OVER (PARTITION BY FK ORDER BY Date) As rn
FROM [MyTable]
WHERE Status = 'K1'
)
SELECT ID, FK, STATUS, DATE
FROM RowNumbers
WHERE rn = 1
Window 功能已添加到 MariaDB 10.2 版中。还需要 CTE,因为 row_number() 直到 在 处理 WHERE 子句后才会计算。