当前位置: 首页 > 面试题库 >

TSQL检查特定的行序列是否存在

杜哲彦
2023-03-14
问题内容

我有一个包含字段的表:

History_ID   ORDER_ID   Previous_STATUS_ID   Next_STATUS_ID
0            2          null                 1
1            2          1                    2
2            2          2                    3
3            1          null                 1
4            2          3                    4
5            3          null                 2
6            2          4                    1
7            2          1                    2
8            2          2                    5
9            7          3                    4

10 4 6 2 11 9 3 5

它包含我的订单IDID状态。基本上,表格包含STATUS每个订单的历史记录。

我想检查一个特定的订单是否具有特定的订单顺序。

示例:如果订单ID 4具有状态,2,4,3,1则返回true

状态应为一个接一个,因此2之后必须为4,4之后为3以及之后为1。

这些顺序为我提供了有关特定订单流程的信息(将在我的报告中显示)。

我需要检查这种序列:

  • 1,2,3
  • 1,4,3,2
  • 4,2
  • (1或2或3或4),5,3-这4个中的一个,然后是5个,然后是3个

我不知道如何从这种查询开始:/

编辑:
我的最终报告是一个表,其中包含有关订单的信息,如下所示:

Orders type  Count      ...
Profile1     145        ...
Profile2     217        ...
Profile3     12         ...
Profile4     2          ...

我大约有80万多个订单,我的报告必须每天完成,因此,我决定创建整个表(检查那些状态并汇总其他表中的信息),而我决定创建一个报告表:

Order_ID   Profile   Order_date   Customer_profile     ...
1          5        '2008-01-03'  2
4          1        '2009-04-10'  3
3          7        '2011-11-03'  1
4523       2        '2012-11-03'  5

这样我就可以创建一个夜间工作,该工作将使用我的信息向该表添加新订单,并且我将仅从该表中进行简单选择,以避免聚合。第一次插入将很大,但是在第二天晚上,它将仅添加新订单。

例如,查看ID = 2
Next_STATUS_ID ale的订单,如下所示:1,2,3,4,1,2,5
…我想检查此订单是否具有历史更改,例如1,2,5,所以我的函数(select语句)如果按顺序找到那些ID,则应重复1。


问题答案:

我认为可以使用递归CTE解决此问题:

with change_tree as 
(
  SELECT order_id,
         previous_status_id, 
         next_status_id,
         cast(next_status_id as varchar(max)) as status_path
  FROM status_change
  WHERE previous_status_id = 1
    AND order_id = 2

  UNION ALL

  SELECT sc.order_id,
         sc.previous_status_id,
         sc.next_status_id,
         ct.status_path + ',' + cast(sc.next_status_id as varchar(max))
  FROM status_change sc 
    JOIN change_tree ct ON ct.next_status_id = sc.previous_status_id AND ct.order_id = sc.order_id
)
SELECT *
FROM change_tree
WHERE status_path = '2,3,5';

这实际上是(递归地)将next_status_id的所有值连接到一个您可以比较的字符串中。

从您的样本数据中,我还不清楚哪条行标记着订单状态更改历史记录的“开始”。您将需要调整并集的第一部分中的位置,以选择正确的“开始”行。



 类似资料:
  • 假设我有一个列表列表。 现在我想检查某一组单词后是否存在单词“is”。 我写了一个单词lise 有没有办法用if语句检查它? 如果我在句子中写< code > if ' is:它将返回List1中的所有三个句子,我希望它返回前两个句子。 有没有办法检查单词' Is '是否正好定位在word_list中的单词之后?提前感谢。

  • 我有两个 char 数组:一个用某个单词填充。例如 第二个是给定的大小,并填充从“a”到“z”的随机字符。 我需要计算一个单词在第二个数组中出现了多少次。例如,假设第二个数组是:< code>{'w ',' j ',' a ',' v ',' a'},给定的示例函数应该返回1,因为单词“java”在数组中只出现一次。 这是我的密码 当我将arr设置为与word相同时,它返回预期值,但当我将arr设

  • 我试图在存储过程中测试序列是否已经存在。 我已经尝试了上面代码片段的几个变体,但没有运气。我一定是给谷歌错误的术语,因为我似乎找不到任何关于这个主题的东西。任何帮助都很感激!

  • 问题内容: 我具有以下数据库结构: 在我的项目永久链接页面上,我有一个“添加到收藏夹”按钮,可在其中插入新行 如果用户已经在收藏夹中将其替换为“从收藏夹中删除”按钮,我希望能够将其替换。 我无法弄清楚其背后的逻辑-是否需要检查其中是否存在具有当前用户ID和永久链接ID的行?这对我不起作用: 问题答案: 您可能想要这样的东西:

  • 问题内容: 我想知道如何检查数据库中的特定表(例如:myTable)中是否存在特定列(例如:日期)。 我已经阅读了此答案,该答案提供了一个查询,该查询导致另一个查询。 但是我需要的是结果。 更新1 如何在C#应用程序中做到这一点? 也许使用或其他? 问题答案: 感谢所有提供解决方案并收集了一些答案的人,我提出了自己的解决方案版本。也许这不是最好的解决方案,但是至少我不需要额外的dll来添加引用或处

  • 我需要检查一列是否存在,如果不存在,请添加它。根据我的研究,sqlite似乎不支持是否应该使用语句和case语句。 以下是我目前掌握的情况: 但我得到了一个错误:接近“ALTER”:语法错误。 有什么想法吗?