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

View on DB Fiddle

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 子句后才会计算。