从 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
我在 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