SQLite мин / макс странное поведение - PullRequest
1 голос
/ 02 февраля 2012

У меня есть таблица рангов, и ее схема определяется как ранг (id, ключ, значение), где ключ является первичным ключом

sqlite> .schema rank
CREATE TABLE 'rank' ( ID VARCHAR, KEY VARCHAR, VALUE VARCHAR NOT NULL );
CREATE INDEX 'rank_id___djklaf3451jlZZZRFfa___' ON 'rank' ( ID );

sqlite> select * from rank;
-----------------------------------------------------
Tymb-W64uwvM|Tymc8LPQnxBg|5
TymdPRdFpBcE|TymdSsaIFhuI|2
TymdPRdFpBcE|TymdjkGgExcE|3
TymeVf6N1RH4|TymeZGxydCJ8|3
TymeVf6N1RH4|Tymeecz1ORW8|20

sqlite> select id,min(value) from rank group by id;
------------------------------------------------------
Tymb-W64uwvM|5
TymdPRdFpBcE|2
TymeVf6N1RH4|20

sqlite> select id,max(value) from rank group by id;
------------------------------------------------------
Tymb-W64uwvM|5
TymdPRdFpBcE|3
TymeVf6N1RH4|3

Как вы можете видеть 3-й результат как для минимального, так и для максимальногофункции неверны.Версия sqlite - 3.6.23.

Любой совет?

Ответы [ 2 ]

5 голосов
/ 02 февраля 2012

Это потому, что value является типом символа (в частности, varchar), а не числовым типом.

Если вы сортируете символьные данные, он выглядит как:

2
20
3
3
5

, что вы увидите, если выполните:

select value from rank order by value asc

Если вы хотите, чтобы он сортировался численно, столбец должен быть определен как числовой тип, например integer.

3 голосов
/ 02 февраля 2012

Это потому, что вы ввели третий параметр VARCHAR. Ответ «правильный», потому что это сортировка VARCHAR. Если бы вы ввели третий параметр INTEGER, вам, вероятно, хотелось бы получить намного лучший результат. т. е. ваше утверждение CREATE TABLE должно было быть:

CREATE TABLE 'rank' ( ID VARCHAR, KEY VARCHAR, VALUE INTEGER NOT NULL );

В противном случае, если ЗНАЧЕНИЕ должно оставаться как VARCHAR, вы должны попробовать следующее предложение выбора, чтобы разыграть его на лету, но, как говорили другие, это не очень хорошо для производительности:

SELECT ID, MIN(CAST(VALUE AS INTEGER)) FROM RANK GROUP BY ID;
...