Sql 不使用CTE(或游标)的迭代查询

Sql 不使用CTE(或游标)的迭代查询,sql,sql-server-2008,Sql,Sql Server 2008,我在一个表中有一些数据,看起来与此类似: Item Date Price A 8/29/2012 $3 B 8/29/2012 $23 C 8/29/2012 $10 A 8/30/2012 $4 B 8/30/2012 $25 C 8/30/2012 $11 A 8/31/2012 $3 B 8/31/2012 $22 C

我在一个表中有一些数据,看起来与此类似:

Item Date Price A 8/29/2012 $3 B 8/29/2012 $23 C 8/29/2012 $10 A 8/30/2012 $4 B 8/30/2012 $25 C 8/30/2012 $11 A 8/31/2012 $3 B 8/31/2012 $22 C 8/31/2012 $8 A 9/01/2012 $3 B 9/01/2012 $26 C 9/01/2012 $9 A 9/02/2012 $3 B 9/02/2012 $24 C 9/02/2012 $9 我需要写一个查询,确定a的价格没有变化 自2012年8月30日起,C项的价格自2012年9月1日起未发生变化,且 要返回两个项目经过的天数,我们正在查找项目 价格不动。我不能使用CTE,或游标,或单独创建 由于web报告的限制,临时表选择进入等 此sql需要在其中运行的工具。我只能使用“基本”单程选择查询 不过,子查询可以工作。有没有人有什么巧妙的想法来解决这个问题 做到这一点

我的第一次尝试是按项目和价格分组,其中价格与 最新价格,计数>2,识别最小日期并进行日期差异 在min date和getdate之间。但是,这只是确定 在这个价格下,它不考虑任何可能有 不同的价格。希望这有意义。

*更新:*

这样行吗

SELECT ct.Item,
    ct.Price,
    datediff(day, max(yt.[Date]), ct.[Date]) AS ChangeDays
FROM
    (SELECT Item, max(Date) as LastDate FROM YourTable GROUP BY Item) maxdata
    INNER JOIN YourTable ct on ct.Item = maxdata.Item and ct.[Date] = maxdata.LastDate
    INNER JOIN YourTable yt on yt.Item = ct.Item and yt.[Date] < ct.[Date] and yt.Price <> ct.Price
GROUP BY ct.Item, ct.Price, ct.[Date]

我给出了这两种类型的年龄,并说明了表中只存在一次的项目,它们没有旧日期。请告诉我们这有多近

更新:我必须更正PriceAgeToNow中的日期计算,并且我还尝试筛选出只有1天新价格的记录。这是你的电话号码


我喜欢在最合适的地方使用windows函数。在这种情况下,有一个有趣的技巧可以找到相同的事物序列。在所有数据上用行号枚举它们,按项目划分,按日期排序。然后,在所有数据中,按项目和价格进行划分,并按日期排序

一段时间后,你会得到

A 8/29 $3 1 1
A 8/30 $4 2 1
A 8/31 $3 3 2
A 9/1  $3 4 3
A 9/3  $3 5 4
对于数据中保持不变的任何价格序列,最后两列之间的差异都是恒定的。然后我们可以用它来找到序列的开始时间。以下查询采用这种方法:

select item, price, (id_seqnum - ipd_seqnum) as groupid, min(date) as mindate
from (select p.*,
             row_number() over (partition by item order by date) id_seqnum,
             row_number() over (partition by item, price order by date) as ipd_seqnum,
             max(date) over (partition by item) as maxdate
      from prices p
     ) t
group by item, price, (id_seqnum - ipd_seqnum)
having max(date) = max(maxdate)

它还会找到每个项目的最长日期,然后选择具有最长日期的分组。

您使用的是哪种DBMS?PostgreSQL?神谕DB2?顺便说一句:您总是可以编写一个视图来返回所需的信息,然后从您的报告工具中从该视图中进行选择对不起,应该说,这是SQL Server 2008。遗憾的是,我也不能写一个视图——这是一个供应商托管的数据库,我们对它拥有只读权限!我有一些使用滞后函数的想法,我想你可能会使用Oracle或PostgreSQL,但SQL Server 2008不支持。你能展示你喜欢的示例输出吗?可以,但包括OP排除的B行,因为它们更改为“昨天”。很好,我还没有看到所有的注释。过滤掉这些记录应该很容易,但我在理解评论中对它们的确切定义时遇到了困难。这看起来很有希望,蒂姆,非常感谢!我需要一点时间来使用它,以适应实际的数据-会让你知道它是如何进行的。再次,非常感谢。嗨,蒂姆-对不起,@pricing声明在这方面是如何工作的?别担心-我知道了。你在用什么平台?谢谢你,戈登。这是一个有趣的选择——我也会这么做。今天学到了很多:-谢谢杰森!现在也在玩这个。非常感谢你的帮助。
select item, price, (id_seqnum - ipd_seqnum) as groupid, min(date) as mindate
from (select p.*,
             row_number() over (partition by item order by date) id_seqnum,
             row_number() over (partition by item, price order by date) as ipd_seqnum,
             max(date) over (partition by item) as maxdate
      from prices p
     ) t
group by item, price, (id_seqnum - ipd_seqnum)
having max(date) = max(maxdate)