-1

我有一张有 3 列的桌子。这是一个示例,其中只有几个演示条目。该表表示项目价格变化的日期。我需要一个查询来告诉我特定日期所有商品的价格。具体日期可能在价格变动之间。价格在午夜发生变化,因此变化的日期,即从那时到上一次变化前一天的价格

itemCode  datePriceEffective  price  
AB         2012-01-01          9.99  
AB         2012-03-02          10.50  
XY         2011-09-20          34.99  

我希望获得给定日期的所有商品价格。没有每个日期的条目,只有价格变化的日期。所以 2012-03-05 会返回

AB 10.50
XY 34.99

和 2012-02-27 将返回:

AB 9.99  
XY 34.99

得到这个所需的 SQL 查询让我无法理解。答案表示赞赏。

编辑为答案方向错误,请参阅斜体进行编辑。

4

7 回答 7

3

这将按每个 itemCode 的 datePriceEffective 的降序检索第一条记录。

select top 1 with ties *
from ATable
where datePriceEffective <= @givenDate
order by row_number() over (partition by itemCode 
                            order by datePriceEffective desc)
于 2012-04-05T10:34:54.367 回答
2
SELECT itemCode,price FRom TableNameHere WHERE datePriceEffective <= '2012-03-05'

在获得更多信息后进行编辑 - 一个“简单”的答案,希望它易于理解。

您将获取在所需日期范围内有效的项目的最新日期,然后将表格连接到自身以获取该日期的价格

SELECT t1.itemCode,t1.price FROM 
  (
  SELECT itemCode,MAX(datePriceEffective) AS datePriceEffective
  FROM TableNameHere
  WHERE datePriceEffective <= '2012-03-05'
  ) a
INNER JOIN TableNameHere t1 ON t1.itemCode = a.itemCode AND t1.datePriceEffective = a.datePriceEffective
于 2012-04-05T10:12:53.243 回答
1

您将需要按如下方式重新加入表:

declare @effdate datetime
set @effdate = CONVERT(datetime,'2012-02-27')

;WITH CTE_DATA as (
    select itemCode='AB',  datePriceEffective = CONVERT(Datetime,'2012-01-01'),  price = 9.99
    union all select itemCode='AB',  datePriceEffective = CONVERT(Datetime,'2012-03-02'),  price = 10.50
    union all select itemCode='XY',  datePriceEffective = CONVERT(Datetime,'2011-09-20'),  price = 34.99
)
select
    d.itemcode,
    price
from
    CTE_DATA d
    join (
        select  
            itemcode,
            effdate = MAX(datepriceeffective)
        from CTE_DATA sub where sub.datepriceeffective <= @effdate
        group by itemcode
    ) x
        on x.itemCode = d.itemCode
        and x.effdate = d.datePriceEffective

请注意,CTE 仅用于此示例,您应该将其交换为您的真实表。

更新:另一种方法是使用 ROW_NUMBER 和 PARTITION,如下所示:

SELECT        
    itemcode,
    price
FROM     
   (
        SELECT   
            itemcode,
            price,
            rowno = ROW_NUMBER() over (partition by itemcode order by datePriceEffective desc)
        from
            CTE_DATA
            where datePriceEffective <= @effdate
    ) x
where 
    rowno = 1

(将此选择替换为上一个查询中的选择以在数据上进行尝试)

于 2012-04-05T10:24:12.120 回答
1
declare @date datetime = '2012-03-05'

select distinct itemcode,
    (
        select top(1) itemprice 
        from mytable mt2 
        where 
            mt1.itemcode = mt2.itemcode and
            mt2.datepriceeffective <= @date
        order by datepriceeffective desc
    ) as itemprice
from 
    mytable mt1
where
    datepriceeffective <= @date
于 2012-04-05T10:33:50.553 回答
1
SELECT b.itemCode, 
(SELECT Price FROM dbo.tblProducts a WHERE datePriceEffective = 
(SELECT MAX(a.datePriceEffective) FROM dbo.tblProducts a WHERE a.itemCode = b.itemCode)) AS Price
FROM dbo.tblProducts b
WHERE b.datePriceEffective <= '2012-03-05'
GROUP BY b.itemCode

我已经测试过了!它将为您提供每件商品的最新价格

于 2012-04-05T10:40:43.020 回答
0

假设您有另一个名为“GivenDate”的列,下面是查询。

SELECT itemCode, price
FROM tblName
WHERE GivenDate= '2012-03-05'
于 2012-04-05T10:21:49.017 回答
0

这适用于 sql2000

SELECT      s.itemCode
            , ( SELECT      TOP 1 price
                FROM        #MyTable
                WHERE       itemCode = s.itemCode
                            AND datePriceEffective < @SearchDate ) AS price
FROM        (
            SELECT DISTINCT itemCode 
            FROM   #MyTable
            ) s
于 2012-04-05T11:54:35.647 回答