您可以使用以下CTEs
模擬在SQL Server 2008中不可用LAG
窗口功能:
;WITH CTE_RN AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY [#], id) AS rn
FROM #mytable
), CTE_LAG AS (
SELECT t1.[#], t1.name,
t1.id AS curId, t2.id AS prevId,
t1.[#] AS cur#, t2.[#] AS lag#
FROM CTE_RN t1
LEFT JOIN CTE_RN t2 ON t1.rn = t2.rn + 1)
現在可以使用過濾掉「重複」記錄以上CTE_LAG
和以下謂詞在您的WHERE
子句中:
;WITH (
... cte definitions here
) SELECT *
FROM CTE_LAG
WHERE (NOT ((prevId <> curId) AND (cur# = lag#))) OR (prevId IS NULL)
如果prevId <> curId
和cur# = lag#
,則有在id
柱和以下記錄的值的變化具有相同的值[#]
與前一個,即它是一個重複。
因此,在(prevId <> curId) AND (cur# = lag#)
上使用NOT
,過濾掉所有'重複'記錄。這意味着記錄(5, abc, 2)
將被淘汰。
SQL Fiddle Demo here
附:您還可以在WHERE
子句的邏輯表達式中添加第name
列,具體取決於定義「重複」的內容。
請編輯您的問題與你想要的輸出。而且,行是否有唯一的ID? – 2015-03-02 12:55:55
@thanks marc_s,是行有唯一的id。 – 2015-03-02 12:58:55