我有两张表想要查询和比较。我想找到客户支付的最新价格,并将其与同一商品的最新报价进行比较,但仅当两个价格不同时才返回结果。下面是一些模拟表。
表1(发票)
客户 | 项目 | 价格 | 翻译日期 |
---|---|---|---|
1505 | ABC | 3.04 | 2024-5-17 |
2106 | ABC | 5.20 | 2024-4-01 |
1505 | ABC | 2.96 | 2024-1-16 |
1505 | ABC | 3.15 | 2023-12-15 |
表2(报价)
客户 | 项目 | 价格 | 翻译日期 |
---|---|---|---|
1505 | ABC | 2.96 | 2024-7-29 |
1505 | ABC | 3.08 | 2024-6-15 |
我可以生成显示与上面的表 1 和表 2 类似的结果的单独查询。这是我正在努力解决的结合和最新的价值观。
结果
客户 | 项目 | 库存价格 | 报价价格 |
---|---|---|---|
1505 | ABC | 3.04 | 2.96 |
我尝试过的脚本。
SELECT Invoices.Customer, Invoices.Item, Invoices.Price AS [InvPrice], Quotes.Price AS [QuotePrice]
FROM Invoices
JOIN Quotes ON Quotes.Customer = Invoices.Customer
WHERE Quotes.Price <> Invoices.Price
AND Invoices.TranDate = (SELECT MAX(TranDate) FROM Invoices)
ORDER BY Customer
谢谢!
您可以使用
ROW_NUMBER
函数获取发票和报价表的最后记录,并使用一些子查询来获取您需要的结果。或者,您可以使用 CTE 而不是子查询。
下面的查询对发票表执行以下操作。
ROW_NUMBER
函数获取每行的行号。它按客户和项目对数据进行分区,然后按 TranDate 按降序对数据进行排序。INNER JOIN
引用子查询以仅包含结果集中具有匹配引号的行。请注意,此查询在大型数据集上会很慢。表中正确的索引应该会有所帮助,但根据我的经验,对于大型数据集,ROW_NUMBER 函数往往会很慢。
SELECT
LastInvoice.Customer,
LastInvoice.Item,
LastInvoice.Price AS InvPrice,
LastQuote.Price AS QuotePrice
FROM
(
SELECT * FROM
(
SELECT
Customer,
Item,
Price,
TranDate,
ROW_NUMBER() OVER (PARTITION BY Customer, Item ORDER BY TranDate DESC) AS RowNumber
FROM Invoices
) AS GroupedResult
WHERE GroupedResult.RowNumber = 1
) AS LastInvoice
INNER JOIN
(
SELECT * FROM
(
SELECT
Customer,
Item,
Price,
TranDate,
ROW_NUMBER() OVER (PARTITION BY Customer, Item ORDER BY TranDate DESC) AS RowNumber
FROM Quotes
) AS GroupedResult
WHERE GroupedResult.RowNumber = 1
) AS LastQuote
ON LastQuote.Customer = LastInvoice.Customer
WHERE LastQuote.Price <> LastInvoice.Price