2016-02-11 49 views
2

這是一個棘手的問題/情況,我的搜索fu失敗了我。在前兩行後選擇分組行SQL Server

可以說我有以下數據

| UID | SharedID | Type | Date  | 
|-----|----------|------|-----------| 
| 1 | 1  | foo | 2/4/2016 | 
| 2 | 1  | foo | 2/5/2016 | 
| 3 | 1  | foo | 2/8/2016 | 
| 4 | 1  | foo | 2/11/2016 | 
| 5 | 2  | bar | 1/11/2016 | 
| 6 | 2  | bar | 2/11/2016 | 
| 7 | 3  | baz | 2/1/2016 | 
| 8 | 3  | baz | 2/3/2016 | 
| 9 | 3  | baz | 2/11/2016 | 

而且我想ommit(在這種情況下,最近的日期)可變數量領先行,並且可以說,這個數字在本例中2。生成的表格會是這樣的:

| UID | SharedID | Type | Date  | 
|-----|----------|------|-----------| 
| 1 | 1  | foo | 2/4/2016 | 
| 2 | 1  | foo | 2/5/2016 | 
| 7 | 3  | baz | 2/1/2016 | 

這是可能的SQL?基本上我想過濾未知數量的行,使用日期列作爲順序。目標是獲取最舊的類型,並獲取過程中的UID列表。

回答

2

當然,這是可能的。使用ROW_NUMBER函數爲每行分配一個值,並按SharedID列進行分區,以便每次標識更改時重新啓動計數,然後選擇那些值大於您的限制的行。

WITH cteNumberedRows AS (
    SELECT UID, SharedID, Type, Date, 
      ROW_NUMBER() OVER(PARTITION BY SharedID ORDER BY Date DESC) AS RowNum 
     FROM YourTable 
) 
SELECT UID, SharedID, Type, Date 
    FROM cteNumberedRows 
    WHERE RowNum > 2; 
+0

這些都是我不知道的所有事情都可能的,謝謝你的見解。這工作像一個魅力。 –

0

不知道我是否明白你的意思,但是像這樣?

SELECT * FROM MyTable t1 JOIN MyTable T2 ON t2.id NOT IN (
SELECT TOP 2 UID FROM myTable 
WHERE SharedID = t1.sharedID 
ORDER BY [Date] DESC 
)