Oracle SQL 查询中的表需要排序逻辑

2024-04-16

我有一个订单ORDER_1MFG_1并前往PORT_B。订单通过不同的地点移动,并在某些地点之间进行处理和维护。

在此示例中,它分为 7 批货物。如果货物在同一地点停留数天,则运输模式为“处理”。

目标数据 https://i.stack.imgur.com/zLmcq.png

ORDER
ORDER_1
SOURCE_LOCATION=MFG_1
DESTINATION_LOCATION=PORT_B


SHIPMENT    SOURCE_LOCATION      DESTINATION_LOCATION         MODE
SHP_A           MFG_1                      WH_1            TRANSPORT
SHP_B           WH_1                       WH_2            TRANSPORT
SHP_C           WH_2                       WH_2            PROCESS
SHP_D           WH_2                       BB_1            TRANSPORT
SHP_E           BB_1                       BB_1            PROCESS
SHP_F           BB_1                       PORT_A          TRANSPORT
SHP_G           PORT_A                     PORT_B          VESSEL

我需要有给定的序列号。如果订单的源位置等于发货源位置 (SHP_A),并且如果订单的目的地位置等于发货目的地位置,则发货顺序将为 1,则它将是最后一次发货 (COUNT(SHIPMENT))

在这里,我需要在两次发货之间有顺序。逻辑是:序列 2 将是源位置等于 SHP_A 的 DESTINATION_LOCATION 的货​​件,如果有 2 个货件从 SHP_A 的 DESTINATION_LOCATION 出发,则将优先考虑 PROCESS MODE,依此类推。

预期顺序 https://i.stack.imgur.com/P3SZF.png

SHIPMENT    SEQUENCE
SHP_A          1
SHP_B          2
SHP_C          3
SHP_D          4
SHP_F          5
SHP_E          6
SHP_G          7

谢谢您的意见。

我无法找到这种排序的简单逻辑。

这是我的原始数据:

Raw Data https://i.stack.imgur.com/Z4jCu.png

预期结果:

预期结果 https://i.stack.imgur.com/LyfDt.png

D R 查询结果 https://i.stack.imgur.com/HMNAx.png 在此输入图像描述 https://i.stack.imgur.com/wYgur.png


提供的数据存在一些问题。目前尚不清楚主要出货数据是否在同一个表中。如果不是那么什么是连接列。另外,ORDER 是保留关键字,它不应该是列的名称。
事件顺序也有问题。唯一对其进行排序的列是“发货”列。幸运的是,它具有可以排序的值。存在一个问题,如果前一行目标位置不等于当前行源位置怎么办?
这是一个适用于问题中的数据的选项。请在尝试完成工作时考虑上述所有内容。
您的数据为:

WITH
    tbl AS
        (
            Select 'MFG_1' "SHIPMENT_SOURCE_LOCATION", 'PORT_B' "SHIPMENT_DESTINATION_LOCAATION", 'ORDER_1' "AN_ORDER", 'SHP_A' "SHIPMENT", 'MFG_1' "SOURCE_LOCATION", 'WH_1' "DESTINATION_LOCATION", 'TRANSPORT' "MODE" From Dual Union All
            Select 'MFG_1' "SHIPMENT_SOURCE_LOCATION", 'PORT_B' "SHIPMENT_DESTINATION_LOCAATION", 'ORDER_1' "AN_ORDER", 'SHP_B' "SHIPMENT", 'WH_1' "SOURCE_LOCATION", 'WH_2' "DESTINATION_LOCATION", 'TRANSPORT' "MODE" From Dual Union All
            Select 'MFG_1' "SHIPMENT_SOURCE_LOCATION", 'PORT_B' "SHIPMENT_DESTINATION_LOCAATION", 'ORDER_1' "AN_ORDER", 'SHP_C' "SHIPMENT", 'WH_2' "SOURCE_LOCATION", 'WH_2' "DESTINATION_LOCATION", 'PROCESS' "MODE" From Dual Union All
            Select 'MFG_1' "SHIPMENT_SOURCE_LOCATION", 'PORT_B' "SHIPMENT_DESTINATION_LOCAATION", 'ORDER_1' "AN_ORDER", 'SHP_D' "SHIPMENT", 'WH_2' "SOURCE_LOCATION", 'BB_1' "DESTINATION_LOCATION", 'TRANSPORT' "MODE" From Dual Union All
            Select 'MFG_1' "SHIPMENT_SOURCE_LOCATION", 'PORT_B' "SHIPMENT_DESTINATION_LOCAATION", 'ORDER_1' "AN_ORDER", 'SHP_E' "SHIPMENT", 'BB_1' "SOURCE_LOCATION", 'BB_1' "DESTINATION_LOCATION", 'PROCESS' "MODE" From Dual Union All
            Select 'MFG_1' "SHIPMENT_SOURCE_LOCATION", 'PORT_B' "SHIPMENT_DESTINATION_LOCAATION", 'ORDER_1' "AN_ORDER", 'SHP_F' "SHIPMENT", 'BB_1' "SOURCE_LOCATION", 'PORT_A' "DESTINATION_LOCATION", 'TRANSPORT' "MODE" From Dual Union All
            Select 'MFG_1' "SHIPMENT_SOURCE_LOCATION", 'PORT_B' "SHIPMENT_DESTINATION_LOCAATION", 'ORDER_1' "AN_ORDER", 'SHP_G' "SHIPMENT", 'PORT_A' "SOURCE_LOCATION", 'PORT_B' "DESTINATION_LOCATION", 'VESSEL' "MODE" From Dual 
        )

执行类似的操作以获取一些附加列,稍后您将需要这些列作为嵌套查询来从中选择预期结果:

        Select 
            t.*,
            ROWNUM "RN",
            CASE 
                WHEN SOURCE_LOCATION = SHIPMENT_SOURCE_LOCATION THEN 'START'
                WHEN DESTINATION_LOCATION = SHIPMENT_DESTINATION_LOCAATION THEN 'END'
            ELSE
                FIRST_VALUE(DESTINATION_LOCATION) OVER(PARTITION BY AN_ORDER ORDER BY AN_ORDER, SHIPMENT Rows Between 1 Preceding And 1 Preceding)
            END "PROGRESS"
        From
            tbl t
        Order By
            t.AN_ORDER, t.SHIPMENT
/*  R e s u l t :
SHIPMENT_SOURCE_LOCATION SHIPMENT_DESTINATION_LOCAATION AN_ORDER SHIPMENT SOURCE_LOCATION DESTINATION_LOCATION MODE              RN PROGRESS
------------------------ ------------------------------ -------- -------- --------------- -------------------- --------- ---------- --------
MFG_1                    PORT_B                         ORDER_1  SHP_A    MFG_1           WH_1                 TRANSPORT          1 START    
MFG_1                    PORT_B                         ORDER_1  SHP_B    WH_1            WH_2                 TRANSPORT          2 WH_1     
MFG_1                    PORT_B                         ORDER_1  SHP_C    WH_2            WH_2                 PROCESS            3 WH_2     
MFG_1                    PORT_B                         ORDER_1  SHP_D    WH_2            BB_1                 TRANSPORT          4 WH_2     
MFG_1                    PORT_B                         ORDER_1  SHP_E    BB_1            BB_1                 PROCESS            5 BB_1     
MFG_1                    PORT_B                         ORDER_1  SHP_F    BB_1            PORT_A               TRANSPORT          6 BB_1     
MFG_1                    PORT_B                         ORDER_1  SHP_G    PORT_A          PORT_B               VESSEL             7 END    
*/

结果表明发货顺序也是您想要的“SEQUENCE”。它位于被选为伪列 ROWNUM 的 RN 列中。还有 PROGRESS 列,其中选择开始和结束,中间有前一行的目标位置。
这可用于检查您的条件(使用 case 表达式)并生成序列。
这是完整的代码和结果:

SELECT
    AN_ORDER, 
    SHIPMENT,
    Sum(CASE WHEN PROGRESS = SOURCE_LOCATION THEN 1 
             WHEN PROGRESS = 'END' THEN 1
             ELSE 0 
             END) OVER(PARTITION BY AN_ORDER ORDER BY AN_ORDER, SHIPMENT Rows Between Unbounded Preceding And Current Row) + 1"SEQUENCE"
FROM
    (
        Select 
            t.*,
            ROWNUM "RN",
            CASE 
                WHEN SOURCE_LOCATION = SHIPMENT_SOURCE_LOCATION THEN 'START'
                WHEN DESTINATION_LOCATION = SHIPMENT_DESTINATION_LOCAATION THEN 'END'
            ELSE
                FIRST_VALUE(DESTINATION_LOCATION) OVER(PARTITION BY AN_ORDER ORDER BY AN_ORDER, SHIPMENT Rows Between 1 Preceding And 1 Preceding)
            END "PROGRESS"
        From
            tbl t
        Order By
            t.AN_ORDER, t.SHIPMENT
    )
/*  R e s u l t :
AN_ORDER SHIPMENT   SEQUENCE
-------- -------- ----------
ORDER_1  SHP_A             1 
ORDER_1  SHP_B             2 
ORDER_1  SHP_C             3 
ORDER_1  SHP_D             4 
ORDER_1  SHP_E             5 
ORDER_1  SHP_F             6 
ORDER_1  SHP_G             7
*/

请考虑这是一个您应该考虑的选项,考虑到所有可能的问题。如果您的数据不处于完美状态,此代码将导致一些重复序列。
问候...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle SQL 查询中的表需要排序逻辑 的相关文章

随机推荐

  • Excel:如何使用数组连接 criteread 部分旁边的字符串(If 函数)

    今天是个好日子 我有一个 Excel 工作表 分为两列 如下所示 我知道如何使用带有 sum 的数组 if 函数来将满足条件的列旁边的所有值相加 如下所示 sum if A1 A5 YES B1 B5 但如何使用字符串进行操作并连接 以便它
  • AdMob 刷新请求

    我有几个令我困惑的问题 谁最负责广告刷新 加载请求后bannerView load GADRequest 让开发者或 Google 进行监控是最佳做法吗 刷新时间应该短至 30 秒还是至少 60 秒 他们建议 60 秒 但给你选择 30 秒
  • Azure 部署错误:找不到 ClientPerfCountersInstaller.exe

    我最近尝试在现有站点和部署上设置 Azure 预览缓存 但由于错误而不得不中止 但是从那时起 当我尝试部署到 Azure 时 我会收到以下错误 找不到名为的文件approot bin Microsoft WindowsAzure Cachi
  • 逆向工程的汇编语言[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • AWS Kubernetes 集群中出现“创建 pod 沙盒失败”pod 错误

    问题摘要我们曾多次观察到 我们的集群运行时遇到这样的问题 一个或多个节点上的一个或多个 Pod 无法启动 Pod 内的一个或多个容器未启动 Pod 显示 创建 Pod 沙箱失败 错误 在 受影响的 节点上重新启动 docker 或 kube
  • spring boot @controller @transactional 不起作用

    I have Transactional控制器类中的方法如下 主要问题是每个服务调用根据日志在其自己的事务中运行 控制器是否忽略了事务功能 我希望学生记录不会被保存 因为我在使用另一个服务之后抛出异常 但更新仍然发生在数据库中 我什至有 E
  • sklearn 中的 SVM 支持增量(在线)学习吗?

    我目前正在设计一个文本文章推荐系统 有趣 或 不有趣 的二元情况 我的要求之一是它应该不断更新以适应不断变化的趋势 据我所知 最好的方法是利用支持增量 在线学习 http en wikipedia org wiki Online 5fmac
  • HQL 子字符串最后 x 个字符

    我对 Hibernate 很陌生 我想获取字符串的最后 N 个字符 我找到了 substring 方法 但这并没有真正帮助 有人有什么主意吗 TIA 我实际上使用子字符串修复了它 我忘了我可以使用参数 我做了类似的事情 Query q wh
  • 在闪亮选项卡中使用多个 R Markdown 文件

    我正在构建一个闪亮的应用程序 我想要有多个选项卡集 到目前为止我得到的代码告诉我 shinyUI navbarPage OEI Grant tabPanel Part 1 Organization tabsetPanel 1 x tabPa
  • 如何在Swagger open api 3.0中定义常量字符串[重复]

    这个问题在这里已经有答案了 如何在 swagger open api 3 0 中定义常量字符串变量 如果我定义枚举 它将如下所示 StatusCode title StatusCode enum success fail type stri
  • 使用Golang登录私有站点并提取信息

    我尝试使用 golang 登录网站的私人区域并提取一些信息 但我似乎不太正确 我设法获取登录页面以获取 csrf 令牌 然后将 csrf 令牌与登录信息一起发布到登录页面 然后我就可以正常登录了 如果我在此时停止 我可以看到我被重定向的页面
  • 当尝试使用 Webdriver 通过 linkText 查找链接时,有没有办法忽略大写字母?

    我正在使用 Selenium 2 Webdriver 我想单击一个链接 但链接文本可以是 Linktext 或 LINKTEXT 还有比这更好的方法吗 List
  • 具有大量输入数据的 REST 端点 (GET)

    我正在开发一个应用程序 我需要将对象列表传递到 REST 端点 该端点将执行一些计算并将结果返回给调用者 问题更多的是一个哲学问题 即如何处理这种情况 在 GET 请求中传递巨大的负载是一个坏主意 同时 它并不是真正的 POST PUT 请
  • 在表单提交上显示 Twitter Bootstrap 模式

    我试图在提交表单时显示模式 并满足某些条件 例如 表单有两个文本字段 如果其中一个已填写 则模式将向用户显示一些信息 如果两个字段均未填写 则表单将不会提交 为此我这样做了但没有成功 jsfiddle jsFiddle 链接 http js
  • 创建二叉树的时间复杂度

    我正在尝试从提供的源创建一棵树 要添加到树中的 2 个节点 以及应添加这 2 个新闻节点的节点 为了找到该节点在树中的位置 我使用了中序遍历 该遍历的时间复杂度为 O n 因此 如果要在树中添加 n 个节点 则创建整个树的时间复杂度为 O
  • 如何在 R 数据库中将相似的字符串分组在一起

    我的小标题只有 1 列 称为 标题 gt dat A tibble 13 x 1 title
  • 在 ITextSharp 免费许可证下动态创建 .pdf

    在 ASP NET C 网站 服务器中 我使用名为 ITextSharp 的 pdf 创建器库来创建包含有关产品的文本和一些图像的 pdf 像往常一样 老板不想购买许可证 我知道如果我使用 ITextSharp 版本 4 1 6 或更低版本
  • BlazeDS 中的多个频道

    我正在尝试设置一个场景 其中 Flex 应用程序将能够使用在实现 BlazeDS 的两个不同 Web 应用程序中编写的资源 我最初尝试这样做在我的 mxml 代码中指定通道集 https stackoverflow com question
  • 无法在 Visual Studio 中将 Ajax Minifier 作为构建后运行

    我已经设置了构建后配置 如所示http www asp net ajaxlibrary ajaxminquickstart ashx http www asp net ajaxlibrary ajaxminquickstart ashx 但
  • Oracle SQL 查询中的表需要排序逻辑

    我有一个订单ORDER 1从MFG 1并前往PORT B 订单通过不同的地点移动 并在某些地点之间进行处理和维护 在此示例中 它分为 7 批货物 如果货物在同一地点停留数天 则运输模式为 处理 目标数据 https i stack imgu