我有一张包含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查询逃脱了我。答案赞赏。
编辑的答案是错误的方向,请参阅斜体编辑。
答案 0 :(得分: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)
答案 1 :(得分: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
答案 2 :(得分: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
(将此选择替换为上一个查询中的选择以对数据进行尝试)
答案 3 :(得分: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
答案 4 :(得分: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
我测试了它!它会为您提供每个项目的最新价格
答案 5 :(得分:0)
假设您有另一个名为'GivenDate'的列,则下面是查询。
SELECT itemCode, price
FROM tblName
WHERE GivenDate= '2012-03-05'
答案 6 :(得分: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