Насколько мне известно, SQlite не хранит такие значения независимо от данных.Однако вы можете легко сделать это, создав таблицу для хранения минимальных и максимальных значений и каждый раз, когда вставляется строка.
Обновления и удаления могут, однако, занимать больше времени, когда необходимо изменить минимальное или максимальное значение..
Вероятно, было бы более эффективно хранить также и rowid строк.
Таблица, такая как: -
CREATE TABLE IF NOT EXISTS minmax_store(max_value INTEGER, max_rowid INTEGER, min_value INTEGER, min_rowid INTEGER);
демо, которое может подойти.Он использует триггеры для ведения таблицы minmax_store : -
DROP TABLE IF EXISTS mydata;
CREATE TABLE IF NOT EXISTS mydata(id INTEGER PRIMARY KEY, myvalue INTEGER);
DROP TABLE IF EXISTS minmax_store;
CREATE TABLE IF NOT EXISTS minmax_store (max_value INTEGER, max_rowid INTEGER, min_value INTEGER, min_rowid INTEGER);
INSERT INTO minmax_store VALUES(-9223372036854775806,-1,9223372036854775807,-1);
DROP TRIGGER IF EXISTS maintain_minmax_after_insert;
CREATE TRIGGER IF NOT EXISTS maintain_minmax_after_insert AFTER INSERT ON mydata
BEGIN
UPDATE minmax_store SET max_value = new.myvalue, max_rowid = new.id WHERE max_value < new.myvalue;
UPDATE minmax_store SET min_value = new.myvalue, min_rowid = new.id WHERE min_value > new.myvalue;
END
;
DROP TRIGGER IF EXISTS maintain_minmax_after_delete;
CREATE TRIGGER IF NOT EXISTS maintain_minmax_after_delete AFTER DELETE ON mydata
WHEN (SELECT max_value FROM minmax_store) = old.myvalue OR (SELECT min_value FROM minmax_store) = old.myvalue
BEGIN
UPDATE minmax_store
SET max_value = (SELECT max(myvalue) FROM mydata), max_rowid = (SELECT rowid FROM mydata ORDER BY myvalue DESC LIMIT 1),
min_value = (SELECT min(myvalue) FROM mydata), min_rowid = (SELECT rowid FROM mydata ORDER BY myvalue ASC LIMIT 1);
END
;
DROP TRIGGER IF EXISTS maintain_minmax_after_update;
CREATE TRIGGER IF NOT EXISTS maintain_minmax_after_update AFTER UPDATE ON mydata
WHEN (SELECT max_value FROM minmax_store) = old.myvalue
OR (SELECT min_value FROM minmax_store) = old.myvalue
OR (SELECT max_value FROM minmax_store) < new.myvalue
OR (SELECT min_value FROM minmax_store) > new.myvalue
BEGIN
UPDATE minmax_store
SET max_value = (SELECT max(myvalue) FROM mydata), max_rowid = (SELECT rowid FROM mydata ORDER BY myvalue DESC LIMIT 1),
min_value = (SELECT min(myvalue) FROM mydata), min_rowid = (SELECT rowid FROM mydata ORDER BY myvalue ASC LIMIT 1);
END
;
INSERT INTO mydata (myvalue) VALUES(1),(4),(6),(7),(8),(3),(5),(0),(9),(100),(200),(55),(66),(33),(4421);
SELECT * FROM minmax_store;
SELECT *,
CASE
WHEN myvalue = (SELECT max_value FROM minmax_store) THEN 'MAX VALUE HERE' ELSE '' END AS isrowmaxvalue,
CASE
WHEN myvalue = (SELECT min_value FROM minmax_store) THEN 'MIN VALUE HERE' ELSE '' END AS isrowminvalue
FROM mydata;
DELETE FROM mydata WHERE myvalue = (SELECT min(myvalue) FROM mydata);
SELECT * FROM minmax_store;
SELECT *,
CASE
WHEN myvalue = (SELECT max_value FROM minmax_store) THEN 'MAX VALUE HERE' ELSE '' END AS isrowmaxvalue,
CASE
WHEN myvalue = (SELECT min_value FROM minmax_store) THEN 'MIN VALUE HERE' ELSE '' END AS isrowminvalue
FROM mydata;
UPDATE mydata SET myvalue = (SELECT max_value FROM minmax_store) + 10 WHERE myvalue = (SELECT min_value FROM minmax_store);
SELECT * FROM minmax_store;
SELECT *,
CASE
WHEN myvalue = (SELECT max_value FROM minmax_store) THEN 'MAX VALUE HERE' ELSE '' END AS isrowmaxvalue,
CASE
WHEN myvalue = (SELECT min_value FROM minmax_store) THEN 'MIN VALUE HERE' ELSE '' END AS isrowminvalue
FROM mydata
Первый запрос возвращает (таблица minmax_store): -
![enter image description here](https://i.stack.imgur.com/w1l6C.png)
Второй запрос возвращает: -
![enter image description here](https://i.stack.imgur.com/MkwFV.png)
Третий запрос после удаления минимальной строки (значение 0), показывает измененные minmax_store как: -
![enter image description here](https://i.stack.imgur.com/LTGia.png)
Возвращает четвертый запрос (тот же, что и второй): -
Пятый запрос после строки с минимальным значением изменяется на максимальное значение + 10 (4431), показывает измененное значение minmax_store as: -
![enter image description here](https://i.stack.imgur.com/7P5Yf.png)
Возвращает шестой запрос (так же, как 2-й и 4-й запросы): -
![enter image description here](https://i.stack.imgur.com/Nmk0h.png)
- Примечание Выше приведено в качестве кода в принципе, он не был тщательно протестирован и, следовательно, может содержать некоторые ошибки и недостатки.