【问题标题】:Select data using closest date使用最接近的日期选择数据
【发布时间】:2021-06-09 02:42:22
【问题描述】:

我有两个如下表:

table1

Date             ID          Price
2014-01-05        B          174.52
2014-02-25        B          181.68
2014-07-28        B          179.82
2014-02-01        C          39.84
2014-07-27        C          42.70
2014-01-30        D          121.63
2014-07-28        D          136.99

table2

Date             ID   Quantity
2014-01-31       B      100
2014-07-28       B      200
2014-02-01       C      250
2014-07-28       C      250
2014-01-31       D      300

我必须根据日期“2017-07-28”的每个 ID 计算 TotalPrice(价格 x 数量),但条件是:如果给定日期没有可用的价格,则最接近但之前的价格应使用日期

我尝试了以下查询,但没有给出正确的输出。

select *, (t1.Price * t2.Quantity) as TotalPrice
from tab1(nolock) t1
inner join tab2(nolock) t2 on t1.ID = t2.ID and t1.date = t2.date
where t1.AsOfdate = '2017-07-28'

计算'C'价格应取2014-07-27。

【问题讨论】:

  • 另一个nolock 瘾君子——你不应该只在例外情况下使用nolock willy nilly。考虑以 DDL+DML 的形式提供您的示例数据,以便更轻松地为您提供帮助。
  • 请用 DDL、DML 更新您的问题
  • @souvik 并更新您对新样本数据的预期结果,这与您现有的样本数据不匹配。

标签: sql sql-server date tsql


【解决方案1】:

只需使用子查询获取相关价格,然后相乘:

create table #table1 (AsOfDate date, ID varchar(50), Price money);
create table #table2 (AsOfDate date, ID varchar(50), Quantity int);

insert into #table1 (AsOfDate, ID, Price)
values
('2017-01-31', 'A', 174.52),
('2017-02-15', 'A', 181.68),
('2017-02-28', 'A', 179.82),
('2017-02-01', 'B', 39.84),
('2017-02-27', 'B', 42.1),
('2017-01-30', 'C', 121.4),
('2017-02-28', 'C', 136.7);

insert into #table2 (AsOfDate, ID, Quantity)
values
('2017-01-31', 'A', 100),
('2017-02-28', 'A', 200),
('2017-02-01', 'B', 250),
('2017-02-28', 'B', 350),
('2017-01-31', 'C', 650);

with cte as (
    select [Date], ID, Quantity
      , (
        select top 1 Price
        from #table1 T1
        where T1.ID = T2.ID
        and T1.[Date] <= T2.[Date]
        order by T1.[Date] desc
      ) Price
    from #table2 T2
    where t2.AsOfdate <= '2017-07-28'
)
select [Date], ID, Quantity * Price TotalPrice
from cte;

这会返回:

AsOfDate ID TotalPrice
2017-01-31 A 17452.00
2017-02-28 A 35964.00
2017-02-01 B 9960.00
2017-02-28 B 14735.00
2017-01-31 C 78910.00

【讨论】:

  • 除了一个公共表表达式(又名 CTE),它暂时存在于语句的执行范围内。
  • CTE 只是语法糖 :) 可以很容易地成为外部查询,但这更简洁。
  • @souvik - 只需更改表名以匹配您的表名,查询将起作用。将 Table1 更改为 tab1,将 Table2 更改为 tab2
  • @ItalianStallion4215,没有结果集不正确。我们从“A”获取重复数据
  • @DaleK,您的查询完全正确。我需要 2017-07-28 的数据,所以放在 where 条件下。赞成你的答案
猜你喜欢
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多