3

长期读者,第一次海报。希望一些 SQL 大师可以借给我一些处理能力来优雅地解决 SQL 问题,而无需游标。

我正在尝试从包含金钱和日期的数据集中创建时间线类型的结果集,其中它们出现的顺序很重要。请参阅下面的示例数据和期望。

DECLARE @OrderData TABLE(
      ID                      INT IDENTITY,
      ProductId               INT,
      WarehouseId             INT,
      Cost MONEY,
      SaleDate          DATETIME
)

 

INSERT INTO @OrderData
VALUES
      (1, 1, 2.71, '2012-02-23 10:01')
      ,(1, 2, 2.71, '2012-02-23 10:02')
      ,(1, 1, 2.71, '2012-02-23 10:03')
      ,(1, 1, 2.71, '2012-02-23 10:04')
      ,(1, 1, 2.71, '2012-02-23 10:05')
      ,(1, 1, 2.8, '2012-02-23 10:06')
      ,(1, 1, 2.9, '2012-02-23 10:07')
      ,(1, 1, 2.71, '2012-02-23 10:08')
      ,(1, 1, 2.71, '2012-02-23 10:09')

我正在寻找的结果是销售时间线,其中包含产品和仓库组合在其自己的销售集中的开始日期和结束日期。一旦数据集中的销售价格发生变化,这应该会在结果集中产生一个新行。

样本数据的结果结构。

Product, warehouse, minsale date, Max sale date
1,1,2.71, 2012-02-23 10.01, 2012-02-23 10.05
1,1,2.80, 2012-02-23 10.06, 2012-02-23 10.06
1,1,2.90, 2012-02-23 10.07, 2012-02-23 10.07
1,1,2.71, 2012-02-23 10.08, 2012-02-23 10.09
1,2,2.71, 2012-02-23 10.02, 2012-02-23 10.02

为任何可用的帮助欢呼。

4

1 回答 1

4

这是一个“差距和孤岛”问题。

select ProductID, WarehouseId, cost, MIN(saledate), MAX(saledate) from
(      
    select *,
        ROW_NUMBER() over (order by saledate)-
        ROW_NUMBER() over (partition by cost order by saledate) grp
    from @OrderData
) v
group by ProductID, WarehouseId, grp, cost
order by WarehouseID, MIN(SaleDate)

欲了解更多信息,请搜索“itzik ben-gan 的间隙和岛屿”

于 2012-10-29T10:06:34.573 回答