SQL查询以获取给定日期的产品价值

时间:2020-10-26 05:54:16

标签: sql sql-server database tsql

我有一个表格,其中列出了特定日期#tableA的产品价格。

create table #tableA
(
    Id int not null,
    ValueDate date,
    Price decimal(9,2)
)

insert into #tableA (Id, ValueDate, Price)
values 
    (1, '2020-08-01', 100),
    (1, '2020-08-05', 110),
    (1, '2020-08-07', 50)

我的另一张桌子上有产品的ID和日期。

create table #tableB
(
    Id int not null,
    Dates date
)

insert into #tableB (Id, Dates)
values
    (1, '2020-08-01'),
    (1, '2020-08-02'),
    (1, '2020-08-03'),
    (1, '2020-08-04'),
    (1, '2020-08-05'),
    (1, '2020-08-06'),
    (1, '2020-08-07'),
    (1, '2020-08-04')

我找不到有效的查询,该查询的结果表给出了给定日期的产品价格。

我期待这个结果。

Id  Dates         ValueDate    Price 
-------------------------------------
1, '2020-08-01', '2020-08-01', 100
1, '2020-08-02', '2020-08-01', 100
1, '2020-08-03', '2020-08-01', 100
1, '2020-08-04', '2020-08-01', 100
1, '2020-08-05', '2020-08-05', 110
1, '2020-08-06', '2020-08-05', 110
1, '2020-08-07', '2020-08-07', 50

1 个答案:

答案 0 :(得分:1)

类似这样的东西:

SELECT DISTINCT B.[id]
               ,B.[Dates]
               ,DS.*
FROM #tableB B
CROSS APPLY
(
    SELECT TOP 1 *
    FROM #tableA A
    WHERE B.[Id] = A.[Id]
        AND B.[Dates] >= A.[ValueDate]
        AND A.[Price] IS NOT NULL
    ORDER BY A.[ValueDate] DESC
) DS;

或者这个:

WITH DataSource AS
(
    SELECT DISTINCT B.[ID]
                   ,B.[Dates]        
                   ,A.[ValueDate]
                   ,A.[Price]
                   ,SUM(IIF(A.[ID] IS NOT NULL, 1, 0)) OVER (ORDER BY B.[Dates]) AS [GroupID]
    FROM #tableB B
    LEFT JOIN #tableA A
        ON B.[Id] = A.[Id]
        AND B.[Dates] = A.[ValueDate]
        AND A.[Price] IS NOT NULL
)
SELECT [ID]
      ,[Dates]
      ,MAX([ValueDate]) OVER (PARTITION BY [GroupID]) AS [ValueDate]
      ,MAX([Price]) OVER (PARTITION BY [GroupID]) AS [Price]
FROM DataSource;

enter image description here