2014-01-28 117 views
1

我正在查询存储在数据库中的一些系统日志,但不幸的是,供应商在表关系方面做了很差的工作来创建数据库结构。我通常用于这类事情的报告工具依赖于标准SQLite查询(无脚本/编码),我宁愿使用该标准报告工具在系统中使用用户操作的此报告,以便它可以安排和监控到确保它运行。sqlite查询 - 将记录添加到空记录之间的记录?

这些日志列出了用户在系统中执行的操作,我需要将两个表结合在一起以获取他们所做的最新报告。

表1:供应商很友善地在这个包含密钥。

Key      Other_Columns 
------------------------------------- 
jdoe|20140122|093537 stuff 
jdoe3|20140122|093657 stuff 
jdoe2|20140122|151644 stuff 

表2:在这一个没有钥匙,但它关系回到其他表。

UID  Date  Time  Server Action 
------------------------------------------------ 
jdoe 1/22/2014 9:35:37 
jdoe 1/22/2014 9:35:37 server1 action1 
jdoe 1/22/2014 9:35:41 server1 action2 
jdoe3 1/22/2014 9:36:57 
jdoe3 1/22/2014 9:36:58 server3 action1 
jdoe3 1/22/2014 9:37:01 server4 action2 
jdoe2 1/22/2014 15:16:44 
jdoe2 1/22/2014 15:16:44 server2 action1 
jdoe2 1/22/2014 15:16:46 server2 action2 
jdoe2 1/22/2014 15:16:49 server2 action3 

现在让这个更有趣,你会发现在表1中的主要使用时间戳作为它的一部分。时间戳与服务器&操作为空的用户的表2中的第一个时间戳匹配。如果查询表2并按日期排序,那么时间,用户所做的每个日志部分都以时间戳和空白服务器&操作条目开头。我能想到的加入这些的唯一方式是通过某种方式使用UID,Date,Time列创建表2的键,但是我需要将相同的键应用于空行为/服务器行之间的每一行。这让我难住。

我想我需要查询表2自己创建下面的临时表,然后再加入到表1,但我不知道如何编写一个查询,可以从表中生成输出2:

UID  Date   Time  Server  Action  Key 
---------------------------------------------------------------------------- 
jdoe  1/22/2014 9:35:37       jdoe|20140122|093537 
jdoe  1/22/2014 9:35:37 server1 action1 jdoe|20140122|093537 
jdoe  1/22/2014 9:35:41 server1 action2 jdoe|20140122|093537 
jdoe3 1/22/2014 9:36:57       jdoe3|20140122|093657 
jdoe3 1/22/2014 9:36:58 server3 action1 jdoe3|20140122|093657 
jdoe3 1/22/2014 9:37:01 server4 action2 jdoe3|20140122|093657 
jdoe2 1/22/2014 15:16:44       jdoe2|20140122|151644 
jdoe2 1/22/2014 15:16:44 server2 action1 jdoe2|20140122|151644 
jdoe2 1/22/2014 15:16:46 server2 action2 jdoe2|20140122|151644 
jdoe2 1/22/2014 15:16:49 server2 action3 jdoe2|20140122|151644 

我不确定这是否可能,但如果是这样,我希望有人知道。

想法?

回答

0

这可能会做你想要什么:

select t2.*, 
     (select "key" 
     from table1 t1 
     where t1."key" >= t2.uid || '|' || strftime(date, '%Y%m%d') 
     order by t1."key" 
     limit 1 
     ) as "Key" 
from table2 t2; 

它找到的第一个键比级联到日期uid大。这应该是你想要的。

+0

这几乎奏效!我其实只是意识到表1并不总是有表2中匹配的记录。表1包含有关用户采取的行动的附加信息,但不是他们所做的所有事情都会在此详细信息中生成日志(想想我为什么要分割这个现在跨表),并且如果t1中没有匹配,那么导致生成的“Key”在t2中不准确。 – user3246693

+0

@ user3246693。 。 。你可以添加一个'where'条件,像't1。“key”就像t2.uid || '|' || strftime(日期,'%Y%m%d')|| '%''。 –

0

SQLite不支持该日期格式。 你必须使用字符串操作来提取日期字段:

SELECT *, 
     Table2.UID || '|' || 
     CASE 
     WHEN Table2.Date LIKE '__/__/____' THEN substr(Table2.Date, 7, 4) ||  substr(Table2.Date, 4, 2) ||  substr(Table2.Date, 1, 2) 
     WHEN Table2.Date LIKE '_/__/____' THEN substr(Table2.Date, 6, 4) ||  substr(Table2.Date, 3, 2) || '0' || substr(Table2.Date, 1, 1) 
     WHEN Table2.Date LIKE '__/_/____' THEN substr(Table2.Date, 6, 4) || '0' || substr(Table2.Date, 4, 1) ||  substr(Table2.Date, 1, 2) 
     WHEN Table2.Date LIKE '_/_/____' THEN substr(Table2.Date, 5, 4) || '0' || substr(Table2.Date, 3, 1) || '0' || substr(Table2.Date, 1, 1) 
     END || '|' || 
     CASE 
     WHEN Table2.Time LIKE '__:__:__' THEN  substr(Table2.time, 1, 2) || substr(Table2.time, 4, 2) || substr(Table2.time, 7, 2) 
     WHEN Table2.Time LIKE '_:__:__' THEN '0' || substr(Table2.time, 1, 1) || substr(Table2.time, 3, 2) || substr(Table2.time, 6, 2) 
     END AS T2Key 
FROM Table1 
JOIN Table2 ON Table1.Key = T2Key 
ORDER BY Date, 
     Time 
+0

谢谢你的收获,日期格式实际上被Excel搞砸了。我将一些数据从表格中复制到MS Excel中,以便在发布之前清理出实际的用户数据。我刚才意识到Excel重新格式化了我的日期。 – user3246693