查询以获得最后的费用

时间:2015-12-11 15:42:35

标签: sql-server

我试图在sql server中进行此查询,但出了点问题。需要一些帮助...

我有一个带有物品移动的桌子和另一个带有其他移动的桌子(买),我在每个日期找到每件商品的成本。所以,我只需要根据移动日期的第一张表来确定最后一天的第二张桌子上的费用。

换句话说,只需搜索第二个表格中的日期低于该项目第一个表格日期的记录,并返回最近日期的成本。

示例:

第一张表

TaskScheduler.Default

第二张表(买入)

REF     DATE
1       2015-10-15
1       2015-08-30
2       2015-09-11
3       2015-05-22
2       2015-03-08
2       2015-07-15
3       2015-11-14
1       2015-11-20

我需要这个结果:

REF     DATE         COST
1       2015-08-20   150
1       2015-10-12   120
2       2015-04-04   270
2       2015-06-15   280
3       2015-03-01   75
3       2015-10-17   80

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:3)

您可以使用OUTER APPLY执行此操作:

SELECT [REF], [DATE], [COST]
FROM Table1 AS t1
OUTER APPLY (
  SELECT TOP 1 COST
  FROM Table2 AS t2
  WHERE t1.REF = t2.REF AND t1.DATE >= t2.DATE
  ORDER BY t2.DATE DESC) AS t3

Demo here

答案 1 :(得分:2)

;WITH cte AS (
    SELECT  ft.*,
            st.[Cost],
            ROW_NUMBER() OVER (PARTITION BY ft.[Ref],ft.[Date] ORDER BY st.[Date] DESC) RN
     FROM   FirstTable ft
            LEFT JOIN SecondTable st ON ft.[Ref] = st.[Ref]
                                    AND ft.[Date] >= st.[Date]
)
SELECT  Ref,
        [Date],
        [Cost]
FROM    cte
WHERE   RN = 1

或者如果你不想使用cte。

SELECT
    Ref,
    [Date],
    [Cost]
FROM
    (SELECT
        ft.*,
        st.[Cost],
        ROW_NUMBER() OVER (PARTITION BY ft.[Ref],ft.[Date] ORDER BY st.[Date] DESC) RN
     FROM
        FirstTable ft
        LEFT JOIN SecondTable st ON ft.[Ref] = st.[Ref]
                                    AND ft.[Date] >= st.[Date]
    ) t
WHERE
    t.RN = 1