SQL Server 2008。仅当“上一个”不同时才重复订购

SQL Server 2008。仅当“上一个”不同时才重复订购,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,假设我有这张桌子: Price | OrderDate | OrderID --------+-------------+----- 5.50000 | 2017-11-02 | 77319 5.30000 | 2017-11-02 | 77320 5.50000 | 2017-11-09 | 77463 5.50000 | 2017-11-16 | 77633 5.50000 | 2017-11-23 | 77839 5.25000 | 2017-11-23 | 7784

假设我有这张桌子:

Price   | OrderDate   | OrderID
--------+-------------+-----
5.50000 | 2017-11-02  | 77319 
5.30000 | 2017-11-02  | 77320
5.50000 | 2017-11-09  | 77463
5.50000 | 2017-11-16  | 77633
5.50000 | 2017-11-23  | 77839
5.25000 | 2017-11-23  | 77840
5.35000 | 2017-11-30  | 78012
5.50000 | 2017-12-07  | 78138
5.50000 | 2017-12-14  | 78283
我需要得到这个结果

Price   | OrderDate   | OrderID
--------+-------------+--------
5.50000  2017-11-02     77319 
5.30000  2017-11-02     77320
5.50000  2017-11-09     77463
5.25000  2017-11-23     77840
5.35000  2017-11-30     78012
5.50000  2017-12-07     78138
粗体的值,我需要分组,只得到一行。表的顺序应该与结果类似

我不知道该怎么做

有什么想法吗

谢谢

假设您可以使用lag:

否则仍然可以重写:

with data as (
    select *, (select max(OrderID from T t2 where t2.OrderId < t.OrderId) as priorOrderId
    from T t
)
select d.*
from data d left outer join T t on t.OrderId = d.priorOrderId
where coalesce(t.Price, -1) <> d.Price;
您可以使用lag窗口函数获取前一行的价格,并忽略价格没有变化的行:

SELECT   price, orderid, orderdate
FROM     (SELECT price, orderid, orderdate,
                 LAG(price) OVER(ORDER BY orderid ASC) AS prev_price
          FROM   mytable)
WHERE    price <> prev_price OR prev_price IS NULL
ORDER BY orderid ASC

如果您的sql server版本为2008,并且不支持滞后窗口功能

SELECT Price,OrderDate,OrderID 
FROM (
    SELECT *,(select top 1 Price FROM T tt where tt.OrderID < t1.OrderID order by tt.OrderID desc) preval
    FROM T t1
) t1
WHERE preval <> Price or preval IS NULL
您可以尝试使用子查询而不是滞后窗口函数

SELECT Price,OrderDate,OrderID 
FROM (
    SELECT *,(select top 1 Price FROM T tt where tt.OrderID < t1.OrderID order by tt.OrderID desc) preval
    FROM T t1
) t1
WHERE preval <> Price or preval IS NULL

这是没有效率的,但它可能很容易理解,在现实生活中,你可能看不到它的低效

SELECT
    Price
    ,OrderDate
    ,OrderID
FROM TableName
WHERE Price <> ISNULL((SELECT TOP 1 Price FROM TableName T2 WHERE T2.OrderID < TableName.OrderID ORDER BY OrderID DESC), -1)

胆量在WHERE子句中。对于每条记录,它会根据[OrderID]查找上一条记录的价格。如果它们不同,它会包括它们。但是,您必须包含ISNULL,因为第一条记录没有以前的记录。

要将它们分组到一条记录中,您需要一些逻辑来确定采用哪个OrderID和OrderDate。此外,…仅当previous不同时才下单…-以前的什么?价格?为什么结果中不包括ID 77633?编辑:不管怎样,您只查看价格,而不是价格/订单日期组合。我不能使用lag,我使用的是sql server 2008我在阅读有关lag的内容,但在sql server 2008中不可用:
SELECT
    Price
    ,OrderDate
    ,OrderID
FROM TableName
WHERE Price <> ISNULL((SELECT TOP 1 Price FROM TableName T2 WHERE T2.OrderID < TableName.OrderID ORDER BY OrderID DESC), -1)