【问题标题】:TSQL Keyword Previous or Last or something similarTSQL 关键字上一个或最后一个或类似的东西
【发布时间】:2012-12-12 15:39:08
【问题描述】:

这个问题是为那些比我有更多 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 也不是,但我希望知道关键字的人可以满足我的要求。

  • 为 Sam 编辑

     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 部分可以正常工作,它会以我想要的方式返回数据,我现在无法比较不同 RowNumber 的 Product_ID

我的 Where 子句是错误的

【问题讨论】:

  • 您的问题非常不清楚,您可以发布一些示例数据和预期结果吗?理想情况下,发布 CREATE TABLEINSERT 语句,其他人只需复制和粘贴即可进行测试。
  • 我不能真正添加​​插入,因为这是在我的 vb.net 应用程序中使用的,并且存储过程会根据需要一次添加一行。

标签: tsql ssms-2012


【解决方案1】:

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

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

  2. 学习使用Row_Number

  3. 将表(带有 Row_Number)与它自身进行比较,其中 instance1.row - 1 = instance2.row。

【讨论】:

  • 在深入研究之后,这是有道理的。我唯一坚持的部分是第 3 点)实例部分。如何比较实例? - 有关更多信息,请参阅我对问题的编辑
  • @BrandonJ 您有两个表引用。我不知道实例是否是 SQL 的正确词。类似From OrderedCount o1, OrderedCount o2, WHERE o1.RowNumber + 1 = o2.RowNumber
  • 没有完全解决我的问题,但它让我走上了正确的道路,谢谢先生!
【解决方案2】:

如果 product_id 是一个标识列,你不能只做 product_id - 1 吗?也就是说,如果是顺序的,和上一条评论中提到的使用ROW_NUMBER是一样的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多