【问题标题】:Auto-increment field that resets after a change in another field在另一个字段更改后重置的自动增量字段
【发布时间】:2011-11-16 11:34:04
【问题描述】:

您能否提供一个非常简单的 SQL 示例,说明如何创建一个自动递增的“计数”或“订单”字段,但在每次更改不同字段后重新启动?在下表中,每次“餐食”字段发生变化时,“订单”字段将从“1”重新开始。谢谢。

用餐      时间    订单
午餐    10:30     1
午餐    11:00     2
午餐    11:15     3
晚餐    4:30      1
晚餐    4:45      2
晚餐    5:00      3
晚餐    5:30      4

【问题讨论】:

    标签: sql count auto-increment database-partitioning


    【解决方案1】:

    这不是您应该存储在数据库中的内容。您基本上将相同的信息存储了两次(在这种情况下,它是派生的,但实际上是相同的),这可能会导致未来出现问题。您将在最后一个之前得到一个新的午餐行,并且订单号将被搞砸等等。相反,只需在需要时计算数量。

    您没有提及您正在使用哪个 RDBMS(在提出问题时包含该信息总是一个好主意),但以下内容将适用于 SQL Server 和其他支持分区函数的 RDBMS:

    SELECT
        meal,
        [time],  -- I'd pick a better column name myself. Reserved words = evil
        ROW_NUMBER() OVER(PARTITION BY meal ORDER BY time) AS [order]  -- Another reserved word! Eeek!
    FROM
        My_Table
    

    【讨论】:

    • 为什么不叫表[Table]?呵呵
    • 谢谢。我在 ASP.NET 中使用 MS SQL。不用担心,实际的字段名称将是 InTime 和 ShiftOrder。
    【解决方案2】:

    不要将Order 存储在表中,而是考虑将其添加到视图中。您可以在需要时从视图而不是表格中进行选择。

    视图可以使用row_number()来计算顺序,比如:

    select  row_number() over (partition by Meal order by Time)
    ,       *
    from    YourTable
    

    Example at SE Data.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      相关资源
      最近更新 更多