如何分配唯一组ID?

时间:2014-01-17 04:17:40

标签: sql sql-server tsql sql-server-2008-r2

我遇到了一个具有挑战性的问题。我想从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!

2 个答案:

答案 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

参考你的小提琴。 希望这会对你有所帮助。