1

SQLite 版本 3.3.6

sqlite中有一个表

CREATE TABLE stats (Date TEXT , Sub TEXT ,  DELAY95TH INT ) ;

每行是:

Date      |Sub|Delay
2012-06-25|212|750
2012-06-25|214|1180
2012-06-25|216|14902

任务是通过汇总延迟获取 Sub 来自前 10 名的所有记录

执行此操作的 SQL:

Select 
    Date, Sub, Delay 
from 
    stats 
where 
    Sub in (select Sub 
            from stats 
            group by Sub  
            order by SUM(Delay) desc limit 10 ) ;

但是,它不会产生任何结果。一旦您删除“order by”子句,查询就会开始工作。

因此,例如:

select 
    Date, Sub, Delay 
from  
    stats  
where
    Sub in (select Sub from stats group by Sub limit 10);

运作良好并产生预期的效果。

更有什者。在同一实例中也有表:

CREATE TABLE data ( Date DATE , Sub INT, Subcont TEXT, Session INT, MsgType TEXT, Score INT);

并选择与有问题的类似,工作正常:

select 
    Subcont, MsgType, SUM(Score) 
from
    data 
where 
    Subcont in (select Subcont 
                from data 
                group by Subcont 
                order by sum(Score) desc limit 10) 
group by
    Subcont, MsgType 
order by 
    Subcont, MsgType; 

它的作用几乎相同:通过汇总 Score 识别前 10 个 Subcont,并显示包含这些 Subcont 的所有记录。它有效!

4

2 回答 2

1

发现问题。

我不知道它是 bug 还是它是为 sqlite 目的而设计的。问题是在使用文本字段操作时,“order by”在子查询中不起作用。

在 Sub 之后,即 TXT 已转换为 INT,接下来的查询开始返回预期的结果:

Select Date, Sub , Delay from stats where Sub in (select Sub from stats group by Sub  order by Sub) ; 
Select Date, Sub , Delay from stats where Sub in (select Sub from stats group by Sub  order by SUM(Delay) desc limit 10 ) ; 

虽然 Sub 是 TEXT,但这些查询什么也没返回。

唯一的问题是:如果 Sub 里面有一些字母并将其转换为 INT 是不可能的,应该怎么做?

于 2012-07-06T16:17:03.947 回答
0

如果我将“日期”列重命名为 d1(日期是 SQL 中的关键字),我会得到预期的(?)输出:

create table stats (d1 date, sub number, delay number);
insert into stats values('2012-06-25', 212, 750);
insert into stats values('2012-06-25', 214, 1180);
insert into stats values('2012-06-25', 216, 14902);

Select D1, Sub , Delay from stats where Sub in (
select Sub from stats group by Sub  order by SUM(Delay) desc limit 10 ) ;

返回 3 行。因此,只需重命名您的日期列并重试:-)

于 2012-07-06T14:34:40.440 回答