2014-01-17 48 views
1

我有一个具有挑战性的问题。我想从1个表中选择一些记录,并从另外两个表中查找所有相关记录。匹配时,我想将这些记录插入到一​​个新的表ORDER BY ID和Time中。插入时,我想为所有具有相同ID的记录分配唯一ID以表示组ID。如何分配唯一的组ID?

这个我可以用CTE做。这是抓住。

每个表格都是特定的记录类型。例如,第一个表是Entries,第二个表是视图等等。

这些是日志表到我无法控制的应用程序,我想通过相同的ID查看条目的电子路径。但是,如果同一个ID有多个条目,我想分割组ID。

如何在SQL Server 2008 R2中执行此操作?

检查出SQL Fiddle我做了一个ID给你一个特定的电子路径的一个很好的例子。在这个例子中,我将要被分配一个唯一的组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之前查找第一个Entry记录。找到时,用该日期时间更新该记录,以便每条记录都知道它是日期时间和最后一个条目日期时间。这应该可以更轻松地选择两个日期之间的点击和视图,并相应地更新每个细分。

  • 更好的是,我可以通过每次点击和查看并找到大于当前日期时间的条目。然后从该列表中选择MIN(时间),并将该日期时间添加到每个单击和查看记录。这样,每次点击和查看都具有相同的日期时间,包括条目,我可以有相似性来分配组ID!

+0

'GroupID' 1001和1002之间有什么区别?所有行似乎具有相同的ID和相同的日期... – Fabio

+0

Fabio:不同之处在于,1001是导致第一个条目记录的所有记录,然后1002是第一个条目记录之后的所有其他记录,并且导致第二个条目记录。如果有5个其他条目记录与点击和视图之间的每一个,那么该ID将上升到1003,1004等。 – Fastidious

回答

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

这里唯一的ID基于前一个'Entry'的数量。如果GroupID将永久存储在数据库中 - 它将工作,直到之前的条目将被删除。例如:你已经有了'groupID' = 6(接下来'groupID'必须= 7)。但是如果删除了'groupID' = 3的'Entry',那么下一个'groupID'将会是6!(复制) – Fabio

+0

赶上法比奥。在这种情况下,随着新记录的进入,每个组ID将在新表中重建。在组ID重复的情况下,不应删除先前的组ID。但是,这仍然是一个很好的提及! – Fastidious

+0

感谢您的建议Turophile。我将在几个小时内对此进行测试并通知您。它看起来不错,符合TSQL。 *穿过手指* – Fastidious

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 [email protected] 
UNION 
SELECT id, time FROM log3 WHERE [email protected] 
ORDER BY 1,2 desc 

SELECT * FROM @temp 

参照你的小提琴。 希望这可以帮助你。

相关问题