1

我正在尝试制作从给定表中获取最近最低日期的最高价格的程序。

在程序中,我只需要传递 MaterialNo 和 Date,基于我想要最近月份最低价格的最高价格。

程序

Declare @MaterialNo numeric(18,0),
        @PassDate smalldatetime,

set @MaterialNo = 3
set @PassDate = '01-jun-2013'

Select Statement (i need This Statement)

Where MaterialNo = @MaterialNo

我的表结构如下

温度表

MaterialNo  Date                Price
1           May, 01 2013        28
1           June, 01 2013       25
1           June, 01 2013       30
1           August, 01 2013     35
2           November, 01 2013   40
2           November, 01 2013   50
2           May, 05 2013        15
3           July, 01 2013       14
3           August, 01 2013     20
3           December, 01 2012   12

预期输出,

如果我通过@MaterialNo 1@PassDate = '30-Jun-2013' 输出 = 30

如果我通过@MaterialNo 1@PassDate = '30-Jul-2013' 输出 = 30

如果我通过@MaterialNo 1@PassDate = '30-Aug-2013' 输出 = 35

如果我通过@MaterialNo 1@PassDate = '30-May-2013' 输出= 28

如果我通过@MaterialNo 2@PassDate = '30-Nov-2013' 输出 = 50

如果我通过@MaterialNo 2@PassDate = '30-Aug-2013' 输出 = 15

如果我通过@MaterialNo 3@PassDate = '15-Dec-2013' 输出= 12

如果我通过@MaterialNo 3@PassDate = '10-Nov-2013' 输出 = 20

如果我通过@MaterialNo 3@PassDate = '20-Sep-2013' 输出 = 20

如果我通过@MaterialNo 3@PassDate = '30-Jul-2013' 输出 = 14

SQLFiddle

4

2 回答 2

3

我会使用以下SELECT语句:

SELECT TOP 1 Price
FROM TempTable
WHERE
  MaterialNo = @MaterialNo
  AND @PassDate >= Date
ORDER BY Date DESC, Price DESC

我先排序,Date然后再排序,以处理 a和(即, )Price DESC存在重复条目的情况。MaterialNoDateMaterialNo = 1Date = '01-Jun-2013'

于 2013-10-05T06:20:24.897 回答
1

您的查询是:

declare @materialNo int = 3
declare @date date = '10-Nov-2013'

Select max(Price) from TempTable
where MaterialNo = @materialNo
and [Date] = (select max(T.[Date]) from TempTable T where T.[Date] < @date
         and T.MaterialNo = TempTable.MaterialNo)

这真的很简单:所选日期是给定材料的参数日期之前的最大值。然后您将获得该日期的最高价格。

感谢您使用 SQL Fiddle!你的脚本有一个错误,最后插入应该是:

Insert Into TempTable Values( 3,'01-Dec-2013',12 ) -- it had wrong year
于 2013-10-05T06:15:40.320 回答