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

这可能很容易做到,但我有一个表,它按价格列出项目,每个项目都有一个版本号,因此有重复的项目具有相同的项目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      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…从以前的版本你下载?然后,您需要存储上一次下载的项目密钥和版本,以便与当前下载的项目和版本进行比较。虽然它们都有多个版本,但我只想要价格已更改的版本。虽然它们都有多个版本,但我只想要价格已更改的版本