2014-10-17 64 views
0

我还是一个SQL新手,在SQLite3测试数据库中播放。我试着在网上挖掘这个答案,但找不到答案。我无法通过WHERE之前的GROUP BY声明排除某些组。SQL:WHERE语句可以筛选出GROUP BY的特定组声明

这里是我的查询:

SELECT USER_ID, SESSION_ID, MAX(SESSION_DURATION), MAX(TIME_STAMP) 
FROM table 
WHERE SESSION_ID <> 0 
GROUP BY USER_ID, SESSION_ID 

基本上在我的数据库中有行,其中会话ID为0,我想将设法组起来之前,排除那些行。但是,结果返回组会话ID为0

感谢您的帮助!

更新1

到sqlfiddle(下同),而创建一个简单的测试数据库查询实际工作类似。

我实际上使用Python和SQLite3库将15 K行CSV文件导入数据库并运行查询。自从我的测试表正在工作以来,显然有些东西是导致我导入代码的原因。我会一直公布你发现的内容。感谢大家的帮助。

更新2

现在我过我的导入代码使用相同的测试表和查询工作使用这个非常简单的CSV文件中筛选出0组。不幸的是,我不能发布多个链接,否则我会发布我的简单测试CSV

但是,用我的15 K CSV文件,它不起作用。这里是一个链接到15 K文件 https://dl.dropboxusercontent.com/u/69835430/sql_session_data.csv

是否有任何特定的边缘情况,我错过了?

更新3 - 最后的答案

由于CL的回答以下关于我的INTEGER列的字符串值。我挖掘了我正在使用的SQLite3模块。

我正在使用sqlite3.dictreader并传入默认读取值。我通过添加一个==''检查解决我的CSV文件之前,将数据放入数据库。

谢谢大家的帮助!

+0

我会尝试创建一个更小的测试数据库来运行它。对不起,不能传出实际的。我还使用SQLite专业个人3.5.6来运行我的查询和管理,如果这有所作为? – ETam 2014-10-17 23:15:24

+0

我创建SESSION_ID作为一个整数。每个用户都分配了一个独特的基于Int的会话ID – ETam 2014-10-17 23:18:25

回答

0
> SELECT 0 <> 0; 
0 
> SELECT '0' <> 0; 
1 

你在你的数据库中有字符串值。 修复它们:

UPDATE MyTable 
SET Session_ID = CAST(Session_ID AS INTEGER); 
+0

谢谢CL!这确实是问题所在。我看着我的导入代码来处理这些特定的情况,并看到为什么SQLite3编写器不处理这种情况。 – ETam 2014-10-20 16:50:22

0

您的方法适用于我(与预期的情况一样)使用简单的数据集。

sqlfiddle

create table tbl (user_id int, session_id int, duration int); 
insert into tbl values (1,0,10); 
insert into tbl values (1,1,2); 
insert into tbl values (2,1,1); 
insert into tbl values (3,2,1); 
insert into tbl values (4,2,5); 

SELECT USER_ID, SESSION_ID, MAX(duration), count(1) 
FROM tbl 
WHERE SESSION_ID <> 0 
GROUP BY USER_ID, SESSION_ID