通过交替行组进行 SQL 分区

2024-03-04

我有一个类似这样的数据表。

|Key|LotId|TransactionType|Quantity|Destination
|1  |A    |Transform      |NULL    |Foo
|2  |A    |Transform      |NULL    |Bar
|3  |A    |Consume        |100     |NULL
|4  |B    |Transform      |NULL    |Bob
|5  |B    |Transform      |NULL    |Fred
|6  |B    |Consume        |75      |NULL
|7  |B    |Consume        |50      |NULL
|8  |B    |Transform      |NULL    |Sally
|9  |B    |Transform      |NULL    |Fred
|10 |B    |Consume        |60      |NULL
|11 |C    |Transform      |NULL    |Bar
|12 |C    |Transform      |NULL    |Fred
|13 |C    |Consume        |25      |NULL

转换线告诉我我的数量去了哪里,消耗线告诉我使用了多少数量。消耗线适用于该 LotId 的所有先前变换线,直到先前的 LotId,或者如果它与先前的变换和消耗分组具有相同的 LotId。更麻烦的是,一组内的转换和消耗线的数量是可变的。我所做的一件事是,变换线首先出现,然后消耗,下次我遇到变换时,我知道一个新的分组已经开始。

|Key|LotId|TransactionType|Quantity|Destination|Grouping
|1  |A    |Transform      |NULL    |Foo        |A1
|2  |A    |Transform      |NULL    |Bar        |A1
|3  |A    |Consume        |100     |NULL       |A1
---------------------------------------------------------
|4  |B    |Transform      |NULL    |Bob        |B1
|5  |B    |Transform      |NULL    |Fred       |B1
|6  |B    |Consume        |75      |NULL       |B1
|7  |B    |Consume        |50      |NULL       |B1
---------------------------------------------------------
|8  |B    |Transform      |NULL    |Sally      |B2
|9  |B    |Transform      |NULL    |Fred       |B2
|10 |B    |Consume        |60      |NULL       |B2
---------------------------------------------------------
|11 |C    |Transform      |NULL    |Bar        |C1
|12 |C    |Transform      |NULL    |Fred       |C1
|13 |C    |Consume        |25      |NULL       |C1

(出于本示例的目的,我们假设数量在所有各方之间平均分配)

  • A1 组 Foo 和 Bar 各 100 人
  • B1 组 Bob 和 Fred 各有 125 人
  • B2 组 Sally 和 Fred 各 60 人
  • C1组,巴尔和弗雷德各有25人

使用sqlRANK(), DENSE_RANK(), & ROW_NUMBER()窗口我正在尝试制定一个查询,它将给我这个分组。一旦我能够获得这一分组,我就应该能够将数据重新连接到自身上,并最终确定我的每个目的地收到了多少数据。

这是在 SQL2008 上的。


使用组合公用表表达式 https://msdn.microsoft.com/en-us/library/ms175972.aspx, outer apply() https://technet.microsoft.com/en-us/library/ms175156(v=sql.105).aspx, and dense_rank() https://msdn.microsoft.com/en-us/library/ms173825.aspx

注意:我更改了列Key to tKey所以我不必在它周围使用方括号。

;with cte as (
  select *
    , PrevTransactionType=isnull(x.Prev_TransactionType,'Consume')
  from t
  outer apply (
      select top 1
        Prev_TransactionType = TransactionType
      from t as i
      where i.tKey < t.tKey
      order by i.tKey desc 
      ) as x
)
select  t.tKey, t.LotId, t.TransactionType, t.Quantity, t.Destination
 , Grouping = LotId + convert(varchar(10),dense_rank() over (
    partition by LotId 
    order by GroupNumber
    )
  )
from cte as t
outer apply (
  select top 1 
    GroupNumber = i.tKey
    from cte as i
    where i.tKey <= t.tKey
      and i.TransactionType = 'Transform'
      and i.PrevTransactionType = 'Consume'
    order by i.tKey desc
    ) x

测试设置:http://rextester.com/LWV40248 http://rextester.com/LWV40248

results:

+------+-------+-----------------+----------+-------------+----------+
| tKey | LotId | TransactionType | Quantity | Destination | Grouping |
+------+-------+-----------------+----------+-------------+----------+
|    1 | A     | Transform       | NULL     | Foo         | A1       |
|    2 | A     | Transform       | NULL     | Bar         | A1       |
|    3 | A     | Consume         | 100      | NULL        | A1       |
|    4 | B     | Transform       | NULL     | Bob         | B1       |
|    5 | B     | Transform       | NULL     | Fred        | B1       |
|    6 | B     | Consume         | 75       | NULL        | B1       |
|    7 | B     | Consume         | 50       | NULL        | B1       |
|    8 | B     | Transform       | NULL     | Sally       | B2       |
|    9 | B     | Transform       | NULL     | Fred        | B2       |
|   10 | B     | Consume         | 60       | NULL        | B2       |
|   11 | C     | Transform       | NULL     | Bar         | C1       |
|   12 | C     | Transform       | NULL     | Fred        | C1       |
|   13 | C     | Consume         | 25       | NULL        | C1       |
+------+-------+-----------------+----------+-------------+----------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过交替行组进行 SQL 分区 的相关文章

  • ADO.NET SQLServer:如何防止关闭的连接持有S-DB锁?

    i Dispose http msdn microsoft com en us library system data sqlclient sqlconnection close aspx一个 SqlConnection 对象 但是当然它并
  • SQL Server:如果存在会大大减慢查询速度

    正在使用SQL Server 2012 我找到了一些关于查询优化的主题 并将 EXISTS 与 COUNT 进行比较 但我找不到这个确切的问题 我有一个看起来像这样的查询 select from tblAccount as acc join
  • 根据数据框中的内容从SQL Server删除行

    我在 SQL Server 中有一个名为的库存表dbo inventory其中包含Year Month Material and Stock quantity 我每天都会收到 csv 文件形式的新库存计数 需要将其加载到dbo invent
  • 如何在Word 2010中从SQL数据库检索数据?

    我想用 MS SQL 数据库中的数据填充 Word 文档 这可能吗 如果可能的话 如何实现 我过去曾通过多种方式做到这一点 这取决于用户是从 Microsoft Word 外部还是从 Microsoft Word 内部启动操作 From I
  • SQL Server - 选择满足条件的第一行

    我有 2 个包含 ID 的表 其中一个表中会有重复的 ID 我只想为表 B 中的每个匹配 ID 返回一行 例如 Table A objectIdA objectIdB 1 A 1 B 1 D 5 F Table B objectIdA 1
  • 重建数据库中的所有索引

    我有一个非常大的 SQL Server 2008 R2 数据库 1 5TB 并将在同一个表中的列之间复制一些数据 我被告知该架构有大量索引 并且想知道是否有默认查询或脚本可以重建所有索引 是否也被建议同时更新统计数据 30 个表中的每一个都
  • 一张表中按最大日期过滤重复行的 SQL 查询

    我有一个 SQL 数据库 persons 它具有基于 IDNum 列的重复条目 我需要查询条目并仅根据最新创建日期显示行或重复条目 这是查询 SELECT IDNum PersonPGUID CreatedDateTime FirstNam
  • SQL Server 读提交隔离级别到底如何工作?

    恕我直言 我发现两个关于如何进行不一致的描述ReadCommitted有效 均在 MSDN 文档中 https msdn microsoft com en us library ms173763 aspx https msdn micros
  • 如果“嵌入式”SQL 2008 数据库文件不存在,如何创建它?

    我使用 C ADO Net 和在 Server Management Studio 中创建的嵌入式 MS SQL 2008 数据库文件 附加到 MS SQL 2008 Express 创建了一个数据库应用程序 有人可以向我指出一个资源 该资
  • SQL Server - 仅执行存储过程角色

    如何创建只能运行的自定义 SQL Server 数据库服务器角色SELECT查询和存储过程 这意味着 该角色的用户不允许执行自定义查询 但可以运行具有 CRUD 和 SysAdmin 语句的存储过程 UPDATES DELETES ALTE
  • 从完整路径解析文件名和路径

    我需要使用 SQL 查询从完整路径解析文件名和文件路径 例如 完整路径 SERVER D EXPORTFILES EXPORT001 csv FileName Path EXPORT001 csv SERVER D EXPORTFILES
  • SQL Server 中全文搜索的奇怪行为

    我的 MyTable 带有列消息 NVARCHAR MAX ID 为 1 的记录包含消息 0123456789333444 Test 当我运行以下查询时 DECLARE Keyword NVARCHAR 100 SET Keyword 01
  • 将逗号分隔的主数据替换为列中的描述

    有 2 个 SQL Server 表 Products Name Status Code Product 1 1001 1003 Product 2 1001 1005 1006 Status Code Description 1001 S
  • SQL Server 2008 GUID 列全为 0

    我希望这是我做的一个简单的傻事 我的数据库中有一个表 设置如下 column name widget guid data type uniqueidentifier allow nulls false default value newid
  • 如何在 CAST/CONVERT 之前检查 VARCHAR(n) 的 XML 格式是否正确

    我的公司有一个日志表 其中包含VARCHAR N 放置字符串的列 即supposed是 XML 但事实证明它并不总是格式良好的 为了对日志记录进行分析 以确定错误趋势等 我一直在使用LIKE陈述 然而 这非常慢 最近 我发现SQL Serv
  • 如何选择列值不不同的每一行

    我需要运行一个 select 语句 返回列值不不同的所有行 例如 EmailAddress 例如 如果表格如下所示 CustomerName EmailAddress Aaron email protected cdn cgi l emai
  • where 子句中的双 %% ?

    我有一个 where 子句 如下例所示 WHERE subject LIKE chef AND dep LIKE psy 使用 1 或 2 符号有什么区别 我知道其中一个的含义 通配符 但不知道第二个添加的功能是什么 该查询可能是一个拼写错
  • 了解 SQL Server 排序规则中的 Unicode 和代码页

    为什么所有 SQL Server 2008 R2 排序规则都与代码页相关联 所有排序规则都是 unicode 吗 当您的数据库被使用不同代码页的多种语言使用时 如何选择排序规则 谢谢 CHAR 与 NCHAR 即非 Unicode 与 Un
  • 从一张表更新并插入另一张表

    我有两张桌子 table1 ID 代码 姓名 table2 ID 代码 姓名 具有相同的列 我想将数据从 table1 插入到 table2 或更新列 如果 table2 中存在 table1 ID table2 ID 执行此操作的简单方法
  • SSRS ReportViewer 与 XML 嵌入数据源相关的问题

    我有 C WPF 应用程序 我想在 ReportViewer 控件中显示 SSRS 报告 本地报告文件中嵌入了 XML 数据源 从 SQL Server Business Intelligence Development Studio 运行

随机推荐

  • 在 SQL Server 2005 数据库中存储 C# DateTimeOffset 值

    我想在 SQL Server 2005 数据库中存储 C DateTimeOffset 值 Sql 2008 将此作为内置类型 但 SQL Server 2005 没有 DateTimeOffset 结构有一个 DateTime 值 我将其
  • 使 PHP GET 参数看起来像目录

    我正在努力做到这一点 http foo foo parameter value 转换 为http foo foo value Thanks 假设您在 Apache 上运行 htaccess 中的这段代码适用于我 RewriteEngine
  • 带 cookie 的 Testcafe 请求

    我试图在 testcafes API 中找到类似于 Cypress 请求的方法 柏 request https docs cypress io api commands request html Cookies会将任何 cookie 附加到
  • 如何计算图像数据集中 RGB 值的 3x3 协方差矩阵?

    我需要计算图像数据集中 RGB 值的协方差矩阵 然后将 Cholesky 分解应用于最终结果 RGB 值的协方差矩阵是 3x3 矩阵 M 其中 M i i 是通道 i 的方差 M i j 是通道 i 和 j 之间的协方差 最终结果应该是这样
  • 输入一个条目会导致所有条目被写入 (Tkinter)

    我正在使用 Tkinter 创建一个带有 GUI 的数独求解器桌面应用程序 我遇到的问题是在输入板时 这是我正在使用的代码 N 9 input 0 for i in range N for j in range N for i in ran
  • 自动链接 html 字符串中的 URL 和图像

    嗨 我有一个像这样的字符串 p class video http vimeo 2342343 p p class image http nerto it logo png p p class text try to write p p cl
  • 如何清除WKWebView的WKBackForwardList?

    看来backForwardListWKWebView 的属性是只读的 但我见过人们使用一些非常神奇的东西来解决这个问题 我需要找出某种方法来清除 WKWebView 的历史记录 我有什么想法可以这样做吗 到目前为止 我已经尝试了一些失败的技
  • read.table 或 read.csv 上的列名称向左移动

    最初我有这个 TSV 文件 示例 name type qty cxfm 1C 0 d2 H50 2 g3g 1G 2 hb E37 1 nlx E45 4 所以我使用 read csv 从 tsv 文件读取数据 但我总是得到以下输出 nam
  • 使用 Websphere MQ 6 授权

    我在运行 Windows Server 2003 的虚拟机上安装了 IBM 的 WebSphere MQ 版本 6 的服务器端 该虚拟机位于 Vista 桌面上 桌面已安装客户端 我有一个小测试程序 来自他们的代码示例 它将一条消息放入队列
  • Javascript 和 AJAX,仅在使用alert()时有效

    我的 JavaScript 遇到问题 它的行为似乎很奇怪 这就是正在发生的事情 我有一个表单 在用户提交后 它调用一个函数 onsubmit 事件 来验证提交的数据 如果有问题或者用户名 电子邮件已经在数据库中 这部分使用 ajax 它将返
  • 获取JUnit 4中@Before中当前正在执行的@Test方法

    我想获取当前正在执行的测试方法 Before这样我就可以将注释应用于当前正在执行的方法 public class TestCaseExample Before public void setUp get current method her
  • 从 bash 调用 php 函数 - 带参数

    我有一个简单的func php文件与concat功能 我想用两个参数从 linux bash shell 调用这个函数 1st Hello 2nd World 并将输出 Hello World 打印到 linux bash shell 请告
  • Laravel 5 - 如何创建 Artisan 命令来执行 bash 脚本

    我想获得一个 artisan 命令来在执行时运行 bash 脚本 所以我使用以下命令创建了一个 artisan 命令 php artisan make command backupList command backup list 这是 ba
  • 保存时 VSCode Prettier 格式搞乱了格式

    在保存功能上使用 VSCode Prettier 格式已经有一段时间了 最近 Javascript 不断犯错误和格式错误 例如 const foo 123 save const foo 1 23 我暂时禁用了它 但是有什么办法可以防止这种情
  • 与泛型的模式匹配

    给定以下类模式匹配 clazz match case MyClass gt someMethod MyClass 是否可以根据模式匹配结果以通用方式引用 MyClass 例如 如果我有 MyClass 的多个子类 我可以编写一个简单的模式匹
  • 使用凭据将 I/O 文件写入共享网络驱动器

    我想将 txt 文件放到共享网络驱动器上 该路径是网络驱动器上的映射 需要凭据 登录名和密码 我可以使用 FileOutputStream 传递这些参数吗 FileOutputStream fos DataOutputStream dos
  • R 2.14.0 包检查中的描述导入顺序:和 NAMESPACE import()

    当我检查包时 我试图找出函数名称之间似乎存在冲突的地方 我最终可能会直接询问这个问题 但首先 我想知道三件事 R exts 中似乎没有提到这三件事 描述 导入和命名空间导入 中列出的包应该是相同的 对吧 在任一列表中 导入顺序重要吗 如果是
  • 将 Html 表转换为数据表的最佳方法是什么

    我有一个 html 表 我想将其转换为数据表 这样做的最佳方法是什么 谢谢 不要自己解析 HTML 有解析库可以为您做到这一点 再加上HTML 敏捷包 http html agility pack net z codeplex和 LINQ
  • Fusion Table 和 Google 服务帐户

    我正在尝试使用 Google 服务帐户从我的 AppENGine Java 应用程序访问 Fusion 表 此代码片段用于获取 OAuth 访问令牌 ArrayList
  • 通过交替行组进行 SQL 分区

    我有一个类似这样的数据表 Key LotId TransactionType Quantity Destination 1 A Transform NULL Foo 2 A Transform NULL Bar 3 A Consume 10