Результат SQLite вышел из строя при использовании DISTINCT - PullRequest
0 голосов
/ 20 апреля 2011

У меня есть запрос SQLite, в котором я упорядочиваю результаты по дате. Это отлично работает. Однако, когда я ввожу «DISTINCT» в оператор SQL, результаты больше не остаются в порядке.

Есть мысли?

SELECT date 
FROM details 
ORDER BY date(date); // Results are ordered correctly

     April 04, 2011
     April 04, 2011
     April 04, 2011
     April 03, 2011
     April 01, 2011
     March 25, 2011

SELECT DISTINCT date 
FROM details 
ORDER BY date(date); // Results are out of order

     April 01, 2011
     April 03, 2011
     April 04, 2011
     March 25, 2011

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

Ваш столбец date не распознается функцией date(), поэтому date(date) дает NULL.

Попробуйте оба запроса с ORDER BY NULL, вы получите те же результаты, что и с ORDER BY date(date)

Без DISTINCT он упорядочивает их по порядку вставки.

При DISTINCT порядок поступает от самого DISTINCT и применяется к столбцу date, который является текстом, поэтому он находится в алфавитном порядке.

SQLite не поддерживает названия месяцев . Измените ваши данные на поддерживаемые форматы (см. Функции даты и времени ) или преобразуйте столбец даты в распознанный формат, прежде чем передать его в date() (со строковыми функциями)

Например (преобразование date в формат YYYY-mmm-dd перед вызовом date() работает):

(здесь CASE WHEN ограничено вашими данными, вы можете распространить его на все месяцы)

SELECT DISTINCT date 
  FROM (SELECT *,
               substr(date, -4) year,
               substr(date, -8, 2) day,
               trim(substr(date, 1, length(date)-8)) month
         FROM details) as details
 ORDER BY date(year
               || '-'
               || CASE WHEN month = 'April' THEN '04' ELSE '03' END
               || '-'
               || day)

, даст правильные результаты с или без DISTINCT.

1 голос
/ 20 апреля 2011

Я не думаю, что ваша строка даты имеет допустимый формат даты.

Попробуйте запустить этот SQL, чтобы увидеть, что вы получаете:

SELECT strftime('%Y-%m-%d', date) FROM details;

Если вы получаете ошибки, этоневерный анализ ваших дат.

Ваш второй запрос возвращается в алфавитном порядке, а не в хронологическом порядке - если это недопустимая дата в этом поле, это будет причиной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...