Sql 如何分配唯一的组ID?

Sql 如何分配唯一的组ID?,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,我有一个挑战性的问题。我想从一个表中选择一些记录,并从另外两个表中查找所有相关记录。匹配后,我希望按ID和时间顺序将这些记录插入到新表中。插入时,我希望为具有相同ID的所有记录分配一个唯一ID,以表示组ID 这我可以用CTE来做。这是陷阱 每个表都是特定的记录类型。例如,第一个表是条目,第二个表是视图,依此类推 这些是指向我无法控制的应用程序的日志表,我希望在其中查看到具有相同ID的条目的电子路径。但是,如果相同ID具有多个条目,我希望拆分组ID 在SQL Server 2008 R2中如何实现

我有一个挑战性的问题。我想从一个表中选择一些记录,并从另外两个表中查找所有相关记录。匹配后,我希望按ID和时间顺序将这些记录插入到新表中。插入时,我希望为具有相同ID的所有记录分配一个唯一ID,以表示组ID

这我可以用CTE来做。这是陷阱

每个表都是特定的记录类型。例如,第一个表是条目,第二个表是视图,依此类推

这些是指向我无法控制的应用程序的日志表,我希望在其中查看到具有相同ID的条目的电子路径。但是,如果相同ID具有多个条目,我希望拆分组ID

在SQL Server 2008 R2中如何实现这一点

查看我制作的,它为您提供了一个关于一个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之前找到第一条条目记录。找到时,用该日期时间更新该记录,以便每个记录都知道它的日期时间和最后一个条目的日期时间。这样可以更容易地选择两个日期之间的单击和视图,并相应地更新每个片段

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

关于你的小提琴。
希望这对您有所帮助。

理解您的问题有点难

但是看着小提琴有帮助

我希望我理解正确

尝试将其添加到架构:

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


注意:我是一名DB2程序员,没有特定的SQL Server知识。

GroupID 1001和1002之间有什么区别?所有行似乎都有相同的ID和相同的日期…Fabio:区别在于1001是第一条记录之前的所有记录,而1002是第一条记录之后的所有其他记录,并且是第二条记录之前的所有记录。如果有5个其他条目记录,每个条目之间都有点击和视图,那么ID将上升到10031004等。这里是基于以前条目数量的唯一ID。若GroupID将永久存储在数据库中,它将一直工作,直到删除以前的条目。示例:您已经拥有groupID=6下一个groupID必须=7。但如果删除了groupID=3的条目,那么下一个groupID将是6!抓好法比奥。在这种情况下,随着新记录的出现,每个组ID都将在新表中重建。如果组ID重复,则不应删除以前的组ID。但是,这仍然是一个很好的提及!谢谢你的建议。我会在几个小时后测试这个,然后告诉你。它看起来很好,符合TSQL。Cross Fingers这并不是一个完整的解决方案-只是足以展示如何创建组并为每个组提供一个唯一的id。我把它留给@Extidious,让它适应他的需要。Okies,我尝试了一下。这个建议对我有效。代码选择ID和时间。然后按ID和时间排序。由于所有的点击和查看总是在条目之前,代码显示了每个条目记录的清晰路径。挑战在于用一个ID对多组点击、视图和条目进行分组。这是通过在条目标记上计算这些组来实现的。在一个有数千个的表中,计数总是用一个新ID重置回0。但关键是,这会添加一个与每个ID的关系,现在从0开始,并对同一ID下的每个条目计数。我现在可以识别它们了!
 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