使用DISTINCT时,SQLite结果不正常

时间:2011-04-20 19:23:22

标签: sql database sqlite

我有一个SQLite查询,其中我按日期排序结果。这很好用。但是,当我在SQL语句中引入“DISTINCT”时,结果不再保持有序。

有什么想法吗?

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 个答案:

答案 0 :(得分:3)

date功能无法识别您的date()列,因此date(date)提供了NULL

尝试使用ORDER BY NULL的两个查询,您将获得与ORDER BY date(date)相同的结果

如果没有DISTINCT,则按插入顺序对它们进行排序。

使用DISTINCT,订单来自DISTINCT本身,并应用于date列,这是一个文本,因此按字母顺序排列。

SQLite不支持月份名称。将数据更改为支持的格式(请参阅Date And Time Functions)或将日期列转换为可识别的格式,然后再将其提供给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 :(得分:1)

我认为您的日期字符串不是有效的日期格式。

尝试运行此SQL以查看您获得的内容:

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

如果您收到错误,则无法正确解析您的日期。

您的第二个查询按字母顺序返回,而不是按时间顺序返回 - 如果它不是该字段中的有效日期,那就是原因。