0

这个问题是为那些比我有更多 SQL 经验的人准备的。

我正在编写一个查询(最终将是一个存储过程,但这应该是无关紧要的),如果最近的条目等于之前输入的那个,我想在其中选择行数。我想继续这样做,直到它遇到具有不同值的条目。(解释得不好,所以我将展示这个例子)

在我的表中,我有一列“Product_Id”,当运行此查询时,我希望它获取 product_id 并将其与先前输入的产品 ID 进行比较,如果它相同,我想添加一个,并且我希望它继续检查之前输入 product_id 直到遇到不同的 product_id

我希望它听起来比它更复杂,查询看起来像

Select count(Product_ID)
FROM dbo.myTable
Where Product_Id = previous(Product_Id)

现在,我知道previous 不是TSQL 中的关键字,Last 也不是,但我希望有人知道我所要求的关键字。

  • 为山姆编辑

     USE DbName;
     GO
    WITH OrderedCount as
    (
    select ROW_NUMBER() OVER (Order by dbo.Line_Production.Run_Date DESC) as RowNumber,
    Line_Production.Product_ID
    From dbo.Line_Production
    )
    Select RowNumber, COUNT(OrderedCount.Product_ID) as PalletCount
    From OrderedCount
    WHERE OrderedCount.RowNumber + 1 = RowNumber
    and Product_ID = Product_ID
    Group by RowNumber
    

OrderedCount 部分有效,它以我想要的方式返回数据,我现在无法比较不同 RowNumbers 的 Product_ID

我的 Where 子句是错误的

4

2 回答 2

2

没有关键字。那将是一个很好的神奇解决方案,但它不存在,至少部分是因为没有保证排序(好吧,只有当有 ORDER BY... 时,你才能拥有关键字)。我可以给你写一个查询,但这需要时间,所以现在我会给你几个步骤,我会回来看看你是否还需要帮助。

  1. 找出一个 ORDER BY,否则不保证任何订单。如果有一个时间输入字段,那是一个不错的选择,或者一个索引,也可以。

  2. 学习使用Row_Number

  3. 将表(带有 Row_Number)与 instance1.row - 1 = instance2.row 的表本身进行比较。

于 2012-12-12T15:49:52.297 回答
0

如果 product_id 是一个标识列,你不能只做 product_id - 1 吗?换句话说,如果它是顺序的,它与使用前面评论中提到的 ROW_NUMBER 相同。

于 2012-12-12T15:52:27.470 回答