2012-04-30 32 views
2

我正在嘗試搜索最近發生的一堆事務,但只想要每次事務的一次返回。我對代碼概率的嘗試比我能解釋得更好。如何基於列過濾器縮小不同的行?

SELECT 
DISTINCT TransactionCode 
    ,  IdKey 
FROM  TransTable 
WHERE  TransactionCode IN (<massive list of ids...>) 
AND   ActionDate  < GETDATE() 
ORDER BY ActionDate DESC 

我想每個交易代碼一個實例,按日期(又名最近該交易的發生)訂購和idKey也回來了。思考?

+0

嘗試使用** **獨特代替 – Addicted

+0

獨特的是應用到表,不是嗎?我無法改變桌子。 – windowskm

回答

5
SELECT TransactionCode, 
     IdKey 
FROM 
    (
    SELECT TransactionCode, 
      IdKey, 
      ROW_NUMBER() OVER(PARTITION BY TransactionCode 
          ORDER BY ActionDate DESC) AS rn 
    FROM TransTable 
    WHERE TransactionCode in (1,2,3) AND 
      ActionDate < GETDATE() 
) T 
WHERE rn = 1 
+0

我認爲子查詢也應該返回'ActionDate',因爲OP似乎想對它所設置的結果進行排序。 –

+0

@AndriyM可能是這樣。我將'order by'子句解釋爲試圖僅爲每個'TransactionCode'獲取「last」行而不是結果集的排序順序。 –

+0

認爲這是它,非常感謝。不是特別熟悉分區,現在必須仔細觀察! 'order by'是我試圖獲得最後/最後一行。 – windowskm

1

可能是,你可以找到這樣的:

;WITH Cte AS (
SELECT 
    ROW_Number() over (partition by TransactionCode, IdKey ORDER BY ActionDate DESC) RowID, 
    TransactionCode, IdKey  
FROM TransTable 
WHERE TransactionCode in (Massive list of IDs) 
AND ActionDate < GETDATE() 
) 
SELECT * FROM Cte WHERE RowID = 1 
2

您需要通過劃分他們TransactionCode列行號分配表中的每一行,然後由ActionDate對它們進行排序降序排列,以便您在該部分的頂部獲得最新的交易。一旦根據此邏輯分配了行號,就可以從派生表輸出中僅過濾出rownum值爲的行。這將獲取所有交易代碼。您可以根據您的要求在下面的查詢中添加過濾條件。

Click here to view the demo in SQL Fiddle

腳本

CREATE TABLE dbo.TransTable 
(
     IdKey   INT   NOT NULL IDENTITY 
    , TransactionCode VARCHAR(10) NOT NULL 
    , ActionDate  DATETIME NOT NULL 
); 

INSERT INTO dbo.TransTable (TransactionCode, ActionDate) VALUES 
    ('code 1', '2012-04-27 01:04:12.467'), 
    ('code 1', '2012-04-22 09:16:29.354'), 
    ('code 2', '2012-04-12 11:04:27.751'), 
    ('code 1', '2012-06-19 12:27:12.232'), 
    ('code 2', '2012-04-04 05:22:17.467'), 
    ('code 3', '2012-05-01 08:49:12.951'), 
    ('code 3', '2012-05-13 06:12:12.234'); 

SELECT IdKey 
    , TransactionCode 
    , ActionDate 
FROM 
(
    SELECT IdKey 
     , TransactionCode 
     , ActionDate 
     , ROW_NUMBER() OVER (
         PARTITION BY TransactionCode 
         ORDER BY ActionDate DESC 
      ) rownum 
    FROM dbo.TransTable 
    WHERE ActionDate < GETDATE() 
) t1 WHERE rownum = 1; 

輸出

IdKey TransactionCode ActionDate 
----- --------------- ----------------------- 
1  code 1   2012-04-27 01:04:12.467 
3  code 2   2012-04-12 11:04:27.750 
+0

哇,更正並很好地解釋,謝謝。 – windowskm