SQL:WHERE语句可以过滤掉GROUP BY语句的特定组

时间:2014-10-17 23:09:16

标签: python sql sqlite

我还是SQL新手并且在SQLite3测试数据库中玩游戏。我尝试在线挖掘这个答案,但找不到答案。我无法让我的测试查询在 GROUP BY 声明之前使用 WHERE 排除某些群组。

以下是我的问题:

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文件导入数据库并运行查询。因为我的Test表正在运行,显然有些东西会破坏我的导入代码。我会告诉你所有我发现的东西。谢谢大家的帮助。

更新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文件之前添加 ==&#39; 检查来修复此问题,然后再将数据放入数据库。

感谢大家的帮助!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

您的数据库中包含字符串值。 修复它们:

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