我还是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; 检查来修复此问题,然后再将数据放入数据库。
感谢大家的帮助!
答案 0 :(得分:0)
您的方法适用于我(如预期),使用简单的数据集。
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);