组和标签与旅行号码

时间:2017-02-15 19:31:03

标签: sql sql-server

我有产品已经发货并经过处理并发货。他们有时会回来再次进行处理。我需要用数字标记每次旅行。我考虑过使用游标,但这会很麻烦,可能不够准确。需要帮忙。见下面的示例:

Item    Date    Process       Trip
1   2/1/2017    Received In    1
1   2/2/2017    Change1        1
1   2/3/2017    Change2        1
1   2/4/2017    Change3        1
1   2/5/2017    Shipped Out    1
1   2/15/2017   Received In    2
1   2/18/2017   Change1        2
1   2/22/2017   Shipped Out    2
2
2
2

3 个答案:

答案 0 :(得分:2)

如果mySet: Set<string> = new Set<string>(); 始终是每个项目的第一个过程,您可以使用运行总和来分配行程编号。每次遇到给定项目Received In时(根据日期的升序排列),将行程重置为下一个数字。

Received In

我假设您的SQL Server版本支持select t.* ,sum(case when process='Received In' then 1 else 0 end) over(partition by item order by date_column) as trip from t 功能。

编辑:要更新“旅行”列,您可以使用SUM() OVER()计算运行总和并进行更新。

cte

答案 1 :(得分:0)

我认为它很好,但您可能想要创建TripType表而不是使用简单的增量。这对用户特别有用。

如果表中的项目已经有更高的旅行次数,我还会考虑阻止插入1。

答案 2 :(得分:0)

我会避免添加&#34; Trip&#34;您在问题中引用的Process Log表的列。这样做我担心会因为不规则的进程事件和对表的意外更新而导致数据不一致。

相反,我会寻求一种方法,在这种方法中,您始终能够根据此表中的数据内容,感兴趣的项目编号和日期参考生成适用的旅行编号值。

考虑使用SQL-Server scalar function来封装get trip number逻辑。 (下图显示了SQL Server 2008 R2系统存储标量函数的位置。) enter image description here

这样的功能可能被称为&#34; fnGetTripNum&#34;带有两个输入参数:项目编号和日期。传递&#34; 1&#34;的项目编号和&#34; 2/18/2017&#34;的日期,然后此功能应返回行程编号&#34; 2&#34;根据您的数据表。 (您可能希望利用vkp的SQL语法建议来实现此功能。)

SQL-Server功能的优点在于它提供了一种封装业务逻辑的方法,以便可以将其一致地应用于使用该功能的多个查询。