2

一連のトランザクションの最新の発生を検索しようとしていますが、各トランザクションを1回だけ返したいと思っています。コードprobでの私の試みは、私ができるよりもそれをよりよく説明しています。

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

各トランザクションコードのインスタンスを1つ、日付順に並べて(別名、そのトランザクションの最新のオカレンス)、idKeyも返します。考え?

4

3 に答える 3

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
于 2012-04-30T11:29:57.057 に答える
2

テーブルの各行に行番号を割り当てて列で分割し、降順でTransactionCode並べ替えて、セクションの一番上に最新のトランザクションが表示されるようにする必要があります。ActionDateこのロジックに基づいて行番号が割り当てられると、派生テーブルの出力からrownum値が1の行のみを除外できます。これにより、すべてのトランザクションコードがフェッチされます。要件に応じて、以下のクエリにフィルター条件を追加できます。

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
于 2012-04-30T11:33:07.320 に答える
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
于 2012-04-30T11:28:39.660 に答える