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