SQL Server2008。仅当先前版本不同时,重复进行排序

时间:2018-11-05 16:58:12

标签: 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  | 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

以粗体显示的值,我需要分组并且仅获得1行。表的顺序应类似于结果。

我不知道如何执行此操作。

有什么想法吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

假设您可以使用lag()

with data as (
    select *, lag(Price) over (order by OrderId) as lastPrice
    from T
)
select *
from data
where coalesce(Price, -1) <> lastPrice;

否则,假设您可以使用cross apply

select t.*
from T t cross apply (
    select max(OrderId) priorOrderId from T t2 where t2.OrderId < t.OrderId
) left outer join T t3 on t3.OrderId = t2.priorOrderId
where coalesce(t3.Price, -1) <> t.Price;

否则仍然可以重写:

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;

答案 1 :(得分:1)

您可以使用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

答案 2 :(得分:1)

如果您的sql server版本是2008,并且不支持groupby窗口功能。

您可以尝试使用子查询代替for-loop窗口函数。

LAG

sqlfiddle

答案 3 :(得分:0)

这不是有效的方法,但可能易于理解,在现实生活中,您可能不会发现它效率低下。

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,因为第一条记录没有上一条记录。