Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 带行程编号的分组和标签_Sql_Sql Server - Fatal编程技术网

Sql 带行程编号的分组和标签

Sql 带行程编号的分组和标签,sql,sql-server,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

我有一些产品是通过加工和出货的。他们有时会回来再次进行处理。我需要给每次旅行都标上一个数字。我曾想过使用光标,但它会很麻烦,可能不够精确。我需要帮助。见下面的示例:

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

如果在中收到的
始终是每个项目的第一个流程,则可以使用运行总和来分配行程编号。每次遇到给定项目在
中收到的
时,将行程重置为下一个数字(基于日期的升序)

我假设您的SQL Server版本支持
SUM()OVER()
函数

编辑:要更新行程列,可以使用
cte
计算运行总和并进行更新

with cte as (select t.*
             ,sum(case when process='Received In' then 1 else 0 end) over(partition by item order by date_column) as trip_column
             from t)
update cte
set trip=trip_column

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

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

我会避免在您的问题中引用的流程日志表中添加“行程”列。我担心这样做会由于不规则的流程事件和表的意外更新而导致数据不一致

相反,我将采用一种方法,根据此表中的数据内容、感兴趣的项目编号和日期参考,您始终能够生成适用的行程编号值

考虑使用a封装get trip number逻辑。(下图显示了SQL Server 2008 R2系统标量函数的存储位置。)

这样一个函数可能被称为“fngetripnum”,它有两个输入参数:item number和date。传递项目编号“1”和日期“2/18/2017”,则此函数应根据您的数据表返回行程编号“2”。(您可能希望利用vkp的SQL语法建议来实现此功能。)


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

您的问题还不清楚。。样本提供了什么意思。。您正在使用什么RDBMS?请更清楚地说明您需要什么输出。我在SQL Server上。我需要的是在trip列中提供trip编号,使用receivein和shipped out作为每次trip的起点和终点。抱歉,我的问题不清楚。这些记录的流程事件有多准确?“接收到”事件是否可能延迟记录到此表或根本不记录?如果是这样的话,可能会产生错误分配的行程编号的连锁反应,鉴于您正在尝试实施的行程编号分配,这将很难纠正。实际上,否。如果没有记录接收到的事件,则在执行接收到的事件之前,员工将无法执行任何其他类型的事件。我喜欢这样的事实,即此答案不需要在问题中引用的表中添加“Trip”列。谢谢。这需要调整。它增加了一个trip列,但我已经有了一个,但调整是最小的。你太棒了,我想我说得太快了。虽然我在语句中创建的“trip”列中得到了正确的trip编号,但我无法引用此列,因为它总是出现无效的列名。我更改了名称并尝试了临时表,将内容复制到另一个表以引用该列,但出现了相同的无效名称错误。我刷新了Intellisense缓存,尝试了所有我知道的技巧,但什么也没有尝试。我的目的是让已经存在的trip列填入语句的结果,而不是创建一个新列。更新语句是完美的,但不起作用。是的。这是个完美的解决方案,效果很好。你仍然摇滚。
with cte as (select t.*
             ,sum(case when process='Received In' then 1 else 0 end) over(partition by item order by date_column) as trip_column
             from t)
update cte
set trip=trip_column