0

変な依頼が来ました。下の表には、vendorno.、act no.、part no.、および movein_date があります。品番の行を選択したいです。各 act_no について、U13 が入る前に最後に来た (U13 partno の movein_date の過去の movein_date が最も近い)。

サンプル:

1.  Vendor_No Act_num Part_Num Movein_Date
2.  708     3321386 T01     2/19/2012
3.  708     3321386 U13     2/15/2012
4.  708     3321386 U01     2/1/2012
5.  708     3321386 T14     1/31/2012
6.  708     3321386 Y10     1/30/2012
7.  708     3321386 U05     12/31/2011
8.  106     3852820 U13     12/30/2012
9.  106     3852820 T28     12/28/2012
10. 106     3852820 U09     11/12/2012
11. 106     3852820 U01     10/24/2012
12. 106     3852820 T09     4/21/2012
13. 472     3925527 U14     8/3/2012
14. 472     3925527 U13     7/3/2012
15. 472     3925527 T01     1/6/2012
16. 472     3925527 T05     1/6/2012
17. 472     3925527 T14     6/12/2011
18. 472     3925527 U01     5/31/2011
19. 685     4938653 U13     1/28/2013
20. 685     4938653 W20     1/20/2013
21. 685     4938653 U01     1/2/2013
22. 685     4938653 W17     12/25/2012
23. 685     4938653 T05     12/20/2012

私が必要とする結果:

1.  Vendor_No   Act_num Part_Num    Movein_Date
2.  708 3321386 U01 2/1/2012
3.  106 3852820 T28 12/28/2012
4.  472 3925527 T01 1/6/2012
5.  472 3925527 T05 1/6/2012
6.  685 4938653 W20 1/20/2013

よくわからない場合はお知らせください。

4

2 に答える 2

0

これを行う 1 つの方法は、RANK 関数を使用することです。

SELECT *
FROM (SELECT *, RANK () OVER(PARTITION BY ACT_NUM ORDER BY Movein_Date DESC)'RowRank'
      FROM Table1
      )a
JOIN (SELECT *, RANK () OVER(PARTITION BY ACT_NUM ORDER BY Movein_Date DESC)'RowRank'
      FROM Table1
      )b
 ON a.RowRank = b.RowRank +1
AND a.ACT_NUM = b.ACT_NUM
 AND b.Part_Num = 'U13'

RANK は基本的に Movein_Date に基づいて行に番号を付けるだけで、RowRank + 1 で JOINING することで 1 行のオフセットを取得できます。

ここにデモがあります: SQL Fiddle 注: 「ID」フィールドは無視してください。これは、例からコピーされた単なる行番号です。

編集:アカウント番号ごとの部分が欠落しており、修正されました。

于 2013-06-13T20:39:21.417 に答える