2017-01-09 11 views
1

私は、顧客アカウントと転記月による販売情報を含むテーブルを持っています。転記月は、YYMMとして書式設定されたテキストフィールドです。私は別々の投稿月を降順で返すためのクエリを簡単に書くことができますが、それから12行目をどのように選ぶのですか?私は、最新の記録より12ヶ月前の投稿月を、スカラー副照会として理想的に選択して、選択基準として使用できるようにしたいと考えています。現時点では、このパラメータはUDFによって提供されていますが、パフォーマンスはサブクエリより優れていると思われます。テーブルで12番目に新しい日付を見つけるにはどうすればよいですか?

+1

あなたはいくつかのコードを投稿することができますか?また、使用しているRDBMSにタグを付けることができますか? –

+0

ANSI SQLには、 'FETCH FIRST'と組み合わせた' OFFSET'節があります。 – jarlh

答えて

2

次の操作を行うことにより、12日を取得することができます:

select distinct month 
from t 
order by month desc 
offset 11 
fetch first 1 row only; 

これはANSI SQLですが、それはすべてのデータベースでは動作しません。ただし、ほとんどのデータベースで同様の機能がサポートされています。

+0

Doooh。私は再びそれを見て非常に簡単です。 X AS(CustomerRebateTracker01Pivot.PostingMonth DESC BY CustomerRebateTracker01Pivot 注文からCustomerRebateTracker01Pivot.PostingMonth DISTINCT TOP 12を選択)から、StartPeriod AS MIN(PostingMonth)を選択します。 – Dougie

0

次のようにあなたは、12行を識別するために、「ウィンドウ関数」を使用することができます...

;WITH cteExampleData 
     (
     PostingMonth, 
     Data 
     ) 
     AS 
     (
     SELECT '1611', 'Test1' 
     UNION ALL SELECT '1612', 'Test2' 
     UNION ALL SELECT '1701', 'Test3' 
     UNION ALL SELECT '1601', 'Test4' 
     UNION ALL SELECT '1602', 'Test5' 
     UNION ALL SELECT '1604', 'Test6' 
     UNION ALL SELECT '1605', 'Test7' 
     UNION ALL SELECT '1501', 'Test8' 
     UNION ALL SELECT '1502', 'Test9' 
     UNION ALL SELECT '1503', 'Test10' 
     UNION ALL SELECT '1401', 'Test11' 
     UNION ALL SELECT '1403', 'Test12' 
     UNION ALL SELECT '1404', 'Test13' 
     UNION ALL SELECT '1405', 'Test14' 
     UNION ALL SELECT '1406', 'Test15' 
     ) 
     SELECT * 
      INTO #ExampleData 
      FROM cteExampleData; 

    ;WITH cteFind12thRow 
     AS 
     (
     SELECT RowNumber = ROW_NUMBER() OVER (ORDER BY PostingMonth), 
      * 
      FROM #ExampleData 
     ) 
     SELECT * FROM cteFind12thRow 
      WHERE RowNumber = 12 
関連する問題