我遇到了一个具有挑战性的问题。我想从1个表中选择一些记录,并从其他2个表中查找所有相关记录。匹配时,我想将这些记录插入到新表ORDER BY ID和Time中。插入后,我想为具有相同ID的所有记录分配唯一ID,以表示组ID。
我可以用CTE做。这是捕获。
每个表都是特定的记录类型。例如,第一个表是Entries,第二个表是视图,依此类推。
这些是我无法控制的应用程序的日志表,我希望通过相同的ID查看条目的电子路径。但是,如果同一个ID有多个条目,我想拆分组ID。
如何在SQL Server 2008 R2中执行此操作?
查看我制作的SQL Fiddle,它为您提供了一个ID的特定电子路径的绝佳示例。在该示例中,我希望在第一个Entry记录之后分配唯一组ID并进行分区,如下所示:
GroupID ID TIME TYPE
1001 3445 January, 01 2014 03:00:00+0000 View
1001 3445 January, 01 2014 04:00:00+0000 View
1001 3445 January, 01 2014 05:00:00+0000 View
1001 3445 January, 01 2014 06:00:00+0000 Click
1001 3445 January, 01 2014 07:00:00+0000 Entry
1002 3445 January, 01 2014 08:00:00+0000 View
1002 3445 January, 01 2014 09:00:00+0000 View
1002 3445 January, 01 2014 10:00:00+0000 View
1002 3445 January, 01 2014 11:00:00+0000 Click
1002 3445 January, 01 2014 12:00:00+0000 Entry
感谢您提供的任何帮助。我还在学习,这个对我来说真的很棘手,但也许我只是忽略了一些正在盯着我看的东西!
备注
我认为为了使这项工作。我必须找到具有相同ID的每个条目记录。然后,对于每条记录,在日期时间之前找到第一个条目记录。找到后,使用该Datetime更新该记录,以便每条记录都知道它的Datetime和最后的Entry Datetime。这样可以更轻松地选择两个日期之间的点击和视图,并相应地更新每个细分。
更好的是,我可以浏览每个点击和查看,并找到大于当前日期时间的条目。然后从该列表中选择MIN(Time),并将Datetime添加到每个Click and View记录中。这样每个Click and View都有相同的Datetime,包括Entry,我可以在其中分配一个Group ID!
答案 0 :(得分:1)
理解你的问题有点难,
但看着小提琴帮了忙。
我希望我理解正确。
尝试将此添加到架构中:
CREATE TABLE temp1
(
id INT NOT NULL ,
time DATETIME NOT NULL ,
type CHAR(5) ,
groupid INT
);
然后执行以下代码:
DELETE FROM temp1;
INSERT INTO temp1
SELECT id ,
time ,
'Entry' ,
0
FROM log1;
INSERT INTO temp1
SELECT id ,
time ,
'View' ,
0
FROM log2;
INSERT INTO temp1
SELECT id ,
time ,
'Click' ,
0
FROM log3;
SELECT id ,
time ,
type ,
( SELECT COUNT(*)
FROM temp1 AS B
WHERE B.type = 'Entry'
AND A.id = B.id
AND B.time < A.time
) AS groupid
FROM temp1 AS A
ORDER BY id ,
groupid ,
time
Here is my edit to your fiddle
注意:我是一名DB2程序员,没有特定的SQL Server知识。
答案 1 :(得分:0)
DECLARE @log1Id VARCHAR(25);
SET @log1Id='3445'
DECLARE @temp TABLE
(
id int IDENTITY(1,1) PRIMARY KEY,
groupid VARCHAR(25),
[time] datetime
);
INSERT INTO @temp (groupid,[time])
SELECT id, time FROM log2 WHERE id=@log1Id
UNION
SELECT id, time FROM log3 WHERE id=@log1Id
ORDER BY 1,2 desc
SELECT * FROM @temp
参考你的小提琴。 希望这会对你有所帮助。