Sql 查找项目的价格是否已更改
这可能很容易做到,但我有一个表,它按价格列出项目,每个项目都有一个版本号,因此有重复的项目具有相同的项目ID和项目名称,但不同的版本可能有不同的价格。我想要一个简单的sql语句来检查哪些商品的价格发生了变化Sql 查找项目的价格是否已更改,sql,sql-server-2008,Sql,Sql Server 2008,这可能很容易做到,但我有一个表,它按价格列出项目,每个项目都有一个版本号,因此有重复的项目具有相同的项目ID和项目名称,但不同的版本可能有不同的价格。我想要一个简单的sql语句来检查哪些商品的价格发生了变化 itemid | item | price |version | date 1 a 1.13 1 2011-12-01 2 b 5.13 1 2011-12-01 3 c
itemid | item | price |version | date
1 a 1.13 1 2011-12-01
2 b 5.13 1 2011-12-01
3 c 3.66 1 2011-12-01
4 a 1.03 2 2012-01-09
5 b 5.13 2 2012-01-09
6 c 3.33 2 2012-01-09
将有很多版本,所以我想我需要一些比较函数,但不确定从哪里开始在SQL
因此,在上面的示例中,我只想取回a和c项,因为它们的价格与以前的版本不同。这将为您提供一个价格与以前版本不同的项目列表:
WITH V AS (
SELECT MAX(version) CurrentFileVersion
FROM yourTable
), C AS (
SELECT item, price, version
FROM yourTable INNER JOIN V ON yourTable.version = V.CurrentFileVersion
), P AS (
SELECT item, price, version
FROM yourTable INNER JOIN V ON yourTable.version = (V.CurrentFileVersion - 1)
)
SELECT C.item
FROM C INNER JOIN
P ON C.item = P.item
WHERE C.price <> P.price;
这甚至显示了所有中间步骤。老实说,我不能让它比这更简单或更明确。这为您提供了一个价格与上一版本相比发生变化的项目列表:
WITH V AS (
SELECT MAX(version) CurrentFileVersion
FROM yourTable
), C AS (
SELECT item, price, version
FROM yourTable INNER JOIN V ON yourTable.version = V.CurrentFileVersion
), P AS (
SELECT item, price, version
FROM yourTable INNER JOIN V ON yourTable.version = (V.CurrentFileVersion - 1)
)
SELECT C.item
FROM C INNER JOIN
P ON C.item = P.item
WHERE C.price <> P.price;
这甚至显示了所有中间步骤。老实说,我无法让它比这更简单或更明确。我假设您希望此信息使用此表中的数据更新表
我会在临时表或CTE中提取每个记录的最新版本。然后,我将运行一个MERGE语句来插入任何新记录或更新任何价格与现有价格不同的记录 我假设您希望此信息使用此表中的数据更新表 我会在临时表或CTE中提取每个记录的最新版本。然后,我将运行一个MERGE语句来插入任何新记录或更新任何价格与现有价格不同的记录 试试看:
SELECT item, COUNT(DISTINCT price) prices
FROM yourTable
/* WHERE clause would go here */
GROUP BY item
HAVING COUNT(DISTINCT price) > 1
可选包括:
WHERE version in (1,2)
-如果您只想比较特定版本1和2。请尝试:
SELECT item, COUNT(DISTINCT price) prices
FROM yourTable
/* WHERE clause would go here */
GROUP BY item
HAVING COUNT(DISTINCT price) > 1
可选包括:
WHERE version in (1,2)
-如果您只想比较特定版本1和2。请尝试此操作
SELECT * FROM Prices T
where exists (
SELECT 1 from Prices
where item = T.item and version = T.version - 1 and price != T.price
)
备注:使用您的表名更改价格
SELECT * FROM Prices T
where exists (
SELECT 1 from Prices
where item = T.item and version = T.version - 1 and price != T.price
)
Ps.更改价格与您的表名相比更改了什么?以后的时间点?存储在其他地方的max_版本?从以前的版本更改从另一个表中存储的以前的版本按项目更改?你需要一个比较源。有点愚蠢的版本无效的价格变化,IMHO…从以前的版本你下载?然后,您需要存储上一次下载的项目密钥和版本,以便与当前下载的项目和版本进行比较。与什么相比发生了更改?以后的时间点?存储在其他地方的max_版本?从以前的版本更改从另一个表中存储的以前的版本按项目更改?你需要一个比较源。有点愚蠢的版本无效的价格变化,IMHO…从以前的版本你下载?然后,您需要存储上一次下载的项目密钥和版本,以便与当前下载的项目和版本进行比较。虽然它们都有多个版本,但我只想要价格已更改的版本。虽然它们都有多个版本,但我只想要价格已更改的版本