0

这听起来像是我大学时应该参加的考试的问题,但我向你保证,这是我正在努力解决的现实世界问题……而且我并不是真正的 SQL 专家。

假设我销售相机(虚构),每台相机都有自己唯一的序列号,格式为 [prefix]-[number]。当我们更改固件或放入新的计算机芯片时,我们会更改前缀。相机有 3 年的 MFG 保修期,所以我们试图给我们的经销商一个序列号,说“任何序列号低于 J05 的相机-123456 可能太旧了,发回去吧”

问题是,我们按顺序生产相机,但是我们仓库的货架上会放 50 台相机,运输人员会随机拿一个并发货,所以它们是半顺序销售的,但是可以大型异常值,其中几个单位被搁置数月然后出售。

大约有 1000 万部连续剧。有什么好方法可以做到这一点?

序列号 | 发售日期
J22-521253 | 2012 年 7 月 2 日
J22-521254 | 2012 年 6 月 28 日
J22-521255 | 2012 年 6 月 28 日
J22-521256 | 2012 年 7 月 1 日
J22-521257 | 2012 年 6 月 22 日
J22-521258 | 2012 年 7 月 4 日
J22-521259 | 2012 年 7 月 1 日
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 | 2012 年 5 月 1 日
Y7-542128 | 2012 年 4 月 18 日
Y7-542129 | 2012 年 4 月 22 日
Y7-542130 | 2012 年 1 月 10 日
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 回答