2014-01-17 52 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 

參照你的小提琴。 希望這可以幫助你。

相關問題