2016-10-03 59 views
1

最新記錄我有一個History表如下:GROUP BY和內部聯接基於時間戳

ID | GroupCode | Category | TimeStamp 
---+-----------+----------+----------- 
1 | x   | shoes | 2016-09-01 
2 | y   | blach | 2016-09-01 

History表得到更新每個月和每個GroupCode單個條目被插入表中。

我也有一個Current表,其中包含最新的位置。

在我更新History表與當前位置之前或之後,我想知道Category是否已從上個月更改爲本月。

我需要比較最近的Category與當前的Category,如果它已更改,則在Current表中標記CategoryChanged

Current表:

ID | GroupCode | Category | CategoryChanged 
---+-----------+----------+---------------- 
1 | x   | shoes | True  
2 | y   | blah  | False 

我試着用INNER JOIN來實現這一點,但我有在History表困難INNER JOIN到最近一個月和一年的條目,但沒有成功。下面

+0

你可以發佈你試過的查詢嗎? –

回答

1
--get highest group code based on timestamp 
;with History 
    as 
    (select top 1 with ties groupcode,category 
    from 
    history 
    order by 
    row_number() over (partition by group code order by timestamp desc) as rownum 
    ) 

--now do a left join with current table 
    select 
    ct.ID, 
    ct.GroupCode, 
    ct.Category, 
    case when ct.category=ht.category or ht.category is null then 'False' 
     else 'true' 
    end as 'changed' 
    from 
    currenttable ct 
    left join 
    history ht 
    on ht.groupcode=ct.groupcode 

使用更新,檢查是否你的選擇值是正確的以後。

update ct 
set ct.category= 
case when ct.category=ht.category or ht.category is null then 'False' 
      else 'true' 
     end 
     from 
     currenttable ct 
     left join 
     history ht 
     on ht.groupcode=ct.groupcode 
+0

如何使用此更新CategoryChanged列? – akd

+0

我不認爲這個代碼會爲你工作,CTE在第一個查詢中只選擇一條記錄,它將隨機選擇一個特定組的最新記錄 - 所以如果你有多個組來檢查,它不管用。第二個更新查詢嘗試將類別更改爲'true'或'false' – Cato

+0

@AndrewDeighton:Cte根據時間戳爲所有組代碼提供最新類別,而不是隨機 – TheGameiswar

0

,如果你犯了一個CTE其中歷史記錄具有rown_numbwer按日期排序從高到低每個GroupCode,那麼你有興趣的行1和2,所以你因此可以加入你的CTE上GroupCode,並選擇記錄1和2,您可以查看是否有類行1和2

;WITH CTE AS (SELECT *, row_number() OVER (PARTITION BY GroupCode ORDER BY TimeStamp Desc) RN FROM History) 
    SELECT 
      C1.ID, 
      C1.GroupCode, 
      C1.Category, 
      CASE WHEN C1.Category = C2.Category THEN 
       'false' 
      else 
       'true' 
      end AS CategoryChanged 

       FROM CTE C1 
         JOIN 
          CTE C2 
           ON C1.GroupCode = C2.GroupCode 
            AND C1.Rn=1 AND C2.RN = 2; 

之間變化如果你有空類別,你可以避免使用 - 順便說一句,你將需要學習如何處理你想要處理它們的NULL - 你不能指望人們在這裏發佈關於你永遠不會提到的NULL的問題!併發生意識到你想與他們做什麼

;WITH CTE AS (SELECT *, row_number() OVER (PARTITION BY GroupCode ORDER BY TimeStamp Desc) RN FROM History) 
    SELECT 
      C1.ID, 
      C1.GroupCode, 
      C1.Category, 
      CASE WHEN C1.Category = C2.Category OR C1.Category IS NULL AND C2.Category IS NULL THEN 
       'false' 
      else 
       'true' 
      end AS CategoryChanged 

       FROM CTE C1 
         JOIN 
          CTE C2 
           ON C1.GroupCode = C2.GroupCode 
            AND C1.Rn=1 AND C2.RN = 2; 
+0

如果類別爲nu​​ll這兩個返回true? – akd

+0

你在這裏有點太苛刻,你知道,如果兩個名字都是'NULL'(或者即使可能發生),你也沒有明確說明你想要做什麼。你也只是模糊地提到你預計會發生一些更新 - 目前還沒有任何明確的細節。 – Cato

+0

我很抱歉。你是對的。我確實急於提出這個問題,而不是花時間來清楚地描述我想實現的目標。我會盡量在稍後更新我的問題。 – akd