0

これは、私が大学で受けた試験の問題のように聞こえますが、私が解決しようとしている現実世界の問題であることを保証します...そして私は実際には SQL の専門家ではありません。

私がカメラ (架空) を販売しているとしましょう。各カメラには、[プレフィックス]-[番号] の形式で固有のシリアル番号があります。ファームウェアを変更したり、新しいコンピューター チップを組み込んだりすると、プレフィックスを変更します。カメラには 3 年間のシェルフ MFG 保証が付いているため、ディストリビューターにシリアル番号を提供して、「シリアル番号が J05 未満のカメラはすべて、 -123456 は古すぎる可能性があります。返送してください"

問題は、私たちはカメラを順番に生産していますが、その後 50 台のカメラが倉庫の棚に置かれ、出荷担当者がランダムに 1 台を取りに行って出荷するため、それらは半順番に販売されますが、いくつかのユニットが数か月間確保され、その後売却された大きな外れ値。

シリーズ数は約1000万本。これを達成する良い方法はありますか?

シリアル | セール日
J22-521253 | 2012 年 7 月 2 日
J22-521254 | 2012 年 6 月 28 日
J22-521255 | 2012 年 6 月 28 日
J22-521256 | 7/1/12
J22-521257 | 2012/6/22
J22-521258 | 7/4/12
J22-521259 | 7/1/12
J22-521260 | 2012/6/27
J22-521261 | 2012 年 6 月 25 日
J22-521262 | 2012/6/20
J22-521263 | 2012 年 8 月 30 日
J22-521264 | 2012 年 6 月 30 日
J22-521265 | 2012 年 6 月 30 日
Y7-542127 | 5/1/12
Y7-542128 | 4/18/12
Y7-542129 | 4/22/12
Y7-542130 | 1/10/12
4

1 に答える 1

0

この質問は、各プレフィックスの保証期間内で最も古いシリアル番号が必要であると言っていると解釈しています。古いものは古すぎるでしょう。

そうでない場合は、質問を明確にしてください。

select prefix, salesdate, serial
from (select left(serial, 3) as prefix,
             row_number() over (partition by prefix order by salesdate) as seqnum
      from (select t.*, left(serial, 3) as prefix
            from t
            where datediff(days, salesdate, CURRENT_TIMESTAMP) < 3*365.25
           ) t
    ) t

これは、row_number() を使用して、まだ保証期間中の最も古いシリアルを見つけます。

于 2012-08-13T18:13:28.730 に答える