从 SQLite 数据库中获取列中具有相同最小值的所有行

Get all raws with the same minimum values in column from SQLite database

我在 c# 中使用 SQLite 数据库,使用 System.Data.SQLite,但这个问题更多是关于 SQLite 的。我有一个 table 这样的:

    Date           Maxt           Mint           Snowrain
1956-04-19         13            -28              0.2
1996-04-19         16            -25              0.7
2015-04-19         12            -23.1             0
1958-04-19         16            -28               4

使用这个查询:

"SELECT strftime('%Y', Date), snowrain, min(mint) FROM Temps where Date like '%04-19'";

我得到:

1956  0.2  -28

但我需要获取所有具有最低温度的日期,例如:

1956  0.2  -28
1958   4   -28

我需要使用什么查询?

P.S。对不起我的英语。

相信下面会如你所愿。但是,您的原始查询结果应该是 1996 0.7 -30 (我怀疑这是因为类型亲和力)

SELECT 
    strftime('%Y', Date), 
    snowrain, 
    mint 
FROM Temps 
WHERE Date 
    LIKE '%04-19' 
    AND CAST(mint AS REAL) = (
        SELECT min(CAST(mint AS REAL)) 
        FROM Temps 
        WHERE date LIKE '%04-19'
    );
  • 注意 CASTs 到 REAL,这可能是您得到 -28 而不是 -30 的原因

使用以下测试:-

DROP TABLE IF EXISTS Temps;
CREATE TABLE IF NOT EXISTS Temps (Date TEXT, Maxt, Mint, Snowrain);
INSERT INTO Temps VALUES 
    ('1956-04-19',13,'-28',0.2),
    ('1996-04-19',16,'-30',0.27),
    ('2015-04-19',12,'-29.1',0),
    ('1958-04-19',16,'-28',4),
    ('1997-04-19',16,'-30',0.27) /* ADDED as -30 min temp  so multiple lowest tempts are available*/
;

SELECT 
    strftime('%Y', Date), 
    snowrain, 
    mint 
FROM Temps 
WHERE Date 
    LIKE '%04-19' 
    AND CAST(mint AS REAL) = (
        SELECT min(CAST(mint AS REAL)) 
        FROM Temps 
        WHERE date LIKE '%04-19'
    );
DROP TABLE IF EXISTS Temps /* Clean up testing environment */ ;
  • 注意 以上使用 Mint 列的数据,如果不使用 CASTs return -28。

结果:-

  • 突出显示的行是添加的额外行,以显示检索到所有具有最低温度的行。

如果使用 sqlite 3.25 或更新版本,可以使用 rank() window 函数:

WITH ranked AS
 (SELECT date, snowrain, mint, rank() OVER (ORDER BY mint) AS rnk
  FROM temps
  WHERE date LIKE '%-04-19')
SELECT strftime('%Y', date) AS year, snowrain, mint
FROM ranked
WHERE rnk = 1
ORDER BY year;
year        snowrain    mint      
----------  ----------  ----------
1956        0.2         -28       
1958        4           -28       

db<>fiddle demonstration