count(distinct) over(按...范围函数分区)

2024-02-10

我想计算不同的yyyydd超过mm(日期)。 (+- 2 天) 但是,distinct 函数不能与 over 一起使用。

如果我删除不同的,它会给我总计数yyyydd, but yyyydd可以有很多重复的。这就是为什么我想添加不同的。 这有点类似于count(distinct) over (partition by... 在 Oracle SQL 中不起作用 https://stackoverflow.com/questions/55347200/countdistinct-over-partition-by-doesnt-work-in-oracle-sql但不同:(

with tbl1 as 
(select 'tay' cst_name, 'toy1' product_name, '20230501' yyyymmdd from dual union all
select 'tay' cst_name, 'toy1' product_name, '20230502' yyyymmdd  from dual union all
select 'tay' cst_name, 'toy1' product_name, '20230507' yyyymmdd from dual union all
select 'ray' cst_name, 'toy2' product_name, '20230321' yyyymmdd from dual union all
select 'ray' cst_name, 'toy2' product_name, '20230421' yyyymmdd from dual union all
select 'ray' cst_name, 'toy2' product_name, '20230422' yyyymmdd  from dual union all
select 'ray' cst_name, 'toy1' product_name, '20230423' yyyymmdd from dual union all
select 'ray' cst_name, 'toy1' product_name, '20230423' yyyymmdd from dual union all
select 'ray' cst_name, 'toy1' product_name, '20230527' yyyymmdd from dual union all
select 'ray' cst_name, 'toy2' product_name, '20230527' yyyymmdd from dual )
,
tbl2 as(
select a.*, substr(yyyymmdd,1,6) as yyyymm, substr(yyyymmdd ,7,9) as mm
from tbl1 a)

select
b.*
, count(1) over (partition by cst_name, product_name order by to_number(mm) range between 2 preceding and 2 following) as cnt
, count(distinct yyyymm) over (partition by cst_name, product_name order by to_number(mm) range between 2 preceding and 2 following) as cnt -- error
from tbl2 b
cst_name prod_name yyyyddmm mm cnt(wrong) cnt(wanted)
tay toy1 20230501 01 2 1
tay toy1 20230502 02 2 1
tay toy1 20230507 07 1 1
ray toy2 20230321 21 3 2
ray toy2 20230421 21 3 2
ray toy2 20230422 22 3 2
ray toy1 20230423 23 2 1
ray toy1 20230423 23 2 1
ray toy1 20230527 27 1 1
ray toy2 20230527 27 1 1

您可以使用model https://docs.oracle.com/en/database/oracle/oracle-database/19/dwhsg/sql-modeling-data-warehouses.html子句来模拟窗口函数,其中包含不允许的操作。

with tbl1 as (
  select '20230321' yyyymmdd from dual union all
  select '20230327' yyyymmdd  from dual union all
  select '20230422' yyyymmdd from dual union all
  select '20230423' yyyymmdd from dual union all
  select '20230501' yyyymmdd from dual union all
  select '20230502' yyyymmdd  from dual union all
  select '20230507' yyyymmdd from dual union all
  select '20230521' yyyymmdd from dual union all
  select '20230523' yyyymmdd from dual union all
  select '20230527' yyyymmdd from dual
)

select *
from tbl1 b
model
  /*To turn off uniqueness check of dimension values*/
  unique single reference
  /*What should be used for offsets*/
  dimension by (substr(yyyymmdd ,7,9) as mm)
  measures (
    /*To include in the output*/
    yyyymmdd,
    /*To allow reference in the right side of RULES*/
    substr(yyyymmdd,1,6) as yyyymm,
    /*Counter for DISTINCT*/
    0 as cnt
  )
  rules update (
      cnt[any] = count(distinct yyyymm)[mm between cv(mm) - 2 and cv(mm) + 2]
  )
order by 1, yyyymmdd
MM YYYYMMDD YYYYMM CNT
01 20230501 202305 1
02 20230502 202305 1
07 20230507 202305 1
21 20230321 202303 3
21 20230521 202305 3
22 20230422 202304 3
23 20230423 202304 3
23 20230523 202305 3
27 20230327 202303 2
27 20230527 202305 2

fiddle https://dbfiddle.uk/N8cAFUyl

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

count(distinct) over(按...范围函数分区) 的相关文章

  • SQL 错误:“没有这样的表”

    我试图解决为什么我的代码为所有查询返回 null 的原因 最后发现 sql 查询什么也没有返回 我使用简约代码创建了一个新的 AIR 文档 s WindowedApplication
  • date_sub 对于 mysql 可以,对于 postgresql 可以

    此查询适用于 mySQL 不适用于 Postgresql select from where id and h gt date sub now INTERVAL 30 MINUTE 错误是 Query failed ERREUR erreu
  • 如何查找当前数据库类型

    我们有一个 SQL 脚本可以在多种类型的数据库上执行 是否可以获取正在执行 SQL 脚本的当前数据库的类型 注意 我们不能使用非标准 SQL 即 TSQL 等 不 ANSI SQL 中没有任何关于确定数据库供应商的内容
  • 在 MySQL 中对整数字段运行带引号的数字(字符串)查询时会发生哪些复杂情况

    在 SQL 中 不应引用整数 因为如果引用 它将是一个字符串 但我很好奇如果我这样做会出现什么问题 并发症 例如 SELECT FROM table WHERE id 1 正确的 vs SELECT FROM table WHERE id
  • MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列

    我试图在不禁用 my ini 中的 only full group by 的情况下弄清楚 这是我的查询 SELECT p title COUNT t qty AS total FROM payments t LEFT JOIN produc
  • 有没有办法阻止 SQL Express 2008 空闲?

    我使用 SQL Express 2008 作为 Web 应用程序的后端 问题是 Web 应用程序是在工作时间使用的 因此有时在午餐或休息时间 如果 20 分钟内没有用户登录 SQL Express 将进入空闲状态模式并释放其缓存 我知道这一
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • 可以使用表通配符创建 sql 查询吗?

    这可能是一个简单的问题 但我无法在网上找到解决方案 任何帮助将不胜感激 我正在尝试在 PHP 中创建一个 SQL 查询 并希望以某种方式将通配符应用于 TABLE 过滤器 可能是这样的 select from table 但是 到目前为止我
  • SQL Server 2008R2 和创建 XML 文档

    论坛上的第一篇文章 因为我真的被这个问题困住了 以下查询正确地将有效的 XML 文档分配给 xTempXML 变量 类型为 xml 注 文档的长度 转换为varchar max 711 select xTempXML select Pres
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 如何搜索例程的内容/(SP-触发函数)

    我需要在数据库内所有例程的例程主体 存储过程 函数 触发器 中搜索文本 我该怎么做 Thanks SELECT OBJECT NAME object id FROM sys sql modules WHERE definition LIKE
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • 如何获取 Oracle 上 SYSDATE 的 UTC 值

    可能是一个经典 您知道在 Oracle 上检索 SYSDATE 的 UTC 值的简单技巧吗 最好也能在第 8 版上工作 现在我有自定义函数 Cheers Stefan 您可以使用 SELECT SYS EXTRACT UTC TIMESTA
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • 从 Getdate() 获取时间

    我想采取Getdate 结果 例如 2011 10 05 11 26 55 000 into 11 26 55 AM 我看过其他地方并发现 Select RIGHT CONVERT VARCHAR GETDATE 100 7 这给了我 11
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • 如何通过SQL查询检查是否有JSON函数?

    有SQL 2016 中的 JSON 函数 https learn microsoft com en us sql t sql functions json functions transact sql例如 JSON VALUE JSON Q
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 是否可以引用同一个表中的不同列?

    如果博客有一个 类别 表 如下所示 CREATE TABLE categories id INTEGER PRIMARY KEY AUTO INCREMENT parent id INTEGER NOT NULL name VARCHAR

随机推荐

  • 从 create-react-app 公共文件夹读取 JSON 文件 [重复]

    这个问题在这里已经有答案了 我有一个 ipAddress json 文件 其中包含以下内容 ipAddress 11 111 111 111 在公共文件夹中 我将该 ipAddress json 文件放入 ipAddress 文件夹中 因此
  • 按日期对 pandas df 中的组进行排序和排名

    从以下类型的数据框中 我希望能够对id日期字段 df pd DataFrame id 1 1 2 3 3 4 5 6 6 6 7 7 value 01 4 2 3 11 21 4 01 3 5 8 9 date 10 01 2017 15
  • 代码挑战:Bash 提示路径缩短器

    我为 bash 实现了一个提示路径缩短器 将其包含在 PS1 环境变量中 它将工作目录缩短为更紧凑但仍具有描述性的目录 我很好奇可能存在什么其他想法 这是挑战 创建 bash 函数 dir chomp可以像这样包含到 PS1 中 插入换行符
  • 如何使用 for 循环迭代子级

    我想迭代 jQuery 的所有子级 children 返回值 像这样 var childs element children for var i 1 i lt childs length 1 i childs foo 我必须在第 3 行写什
  • 创建新的 OneNote 笔记本 错误请求

    我想使用 Graph api 创建一个新的 OneNote 笔记本 我正在关注这份文件 使用 Graph Explorer 我无损地创建了它 但我想从不同的环境中实现相同的目标 例如 Postman 我通过 client credentia
  • 更改 Derby 数据库密码

    我已经在 Glassfish Netbeans 中设置了 Derby DB 密码 我还选中了记住我复选框 现在我无法再更改密码了 要更改密码您只需执行 call SYSCS UTIL SYSCS SET DATABASE PROPERTY
  • CakePHP 3 和表单验证错误

    我使用 cakePHP 3 并且我有一个使用 Form gt input 的登录表单 如果我故意犯了一个错误 这个错误不会出现在表单字段下 它没有出现在任何地方 我的代码是这样的 newUser this gt Users gt newEn
  • 如何将 NULL 值更改为空字符串?

    我有一个 SSIS 包 它将数据从可为空的列复制到同一列不可为空的表 使源不可为空涉及繁文缛节 因此现在我需要一种方法将空值更改为空字符串 我从 ADO Net 源获取数据 而不是从查询中获取数据 在查询中我可以添加空值检查 如果需要 我可
  • 如何创建一个播放 mp3 google tts 的按钮

    我是新来的 但我希望你能帮助我 我正在尝试创建一个按钮来播放谷歌生成的文本到语音 mp3 我正在创建一个翻译器 所以 我想要做的是像谷歌翻译这样的事情 以某种方式 我尝试过使用 javascript 和 actionscript 但无法使其
  • 使用 pip 安装时出错

    尝试卸载用 pip 安装的软件包 我卸载了一些 现在 pip 不起作用 我尝试安装熊猫 sudo pip install pandas 这是错误 Requirement already satisfied use upgrade to up
  • 同步服务运行后刷新 FragmentActivity 中的片段

    有没有人有任何优雅的解决方案来刷新Views in Fragments in a FragmentActivity s ViewPager同步后Service from a SyncAdapter runs 我试过打电话notifyData
  • IndexAxisValueFormatter 未按预期工作

    我正在使用MPAndroid图表 https github com PhilJay MPAndroidChart创建条形图 我的配置
  • Magento:如何获取属于属性集的属性?

    有了属性集 如何获取它包含的属性列表 或者更好的是 仅获取不属于默认属性集的自定义属性 属性集本身可以通过多种方式获取 例如 entityTypeId Mage getModel eav entity gt setType catalog
  • `const_iterator` 真的需要是与 `iterator` 不同的类吗?

    假设我定义了某种容器A struct A iterator begin return iterator this 0 const iterator cbegin const return iterator this last 假设现在我想声
  • Lisp 中无重复数字的随机列表

    我有这个函数可以创建一个包含其他问题中的初始元素的列表Lisp 中带有初始元素的列表从 99 开始到 0 https stackoverflow com questions 59039638 list with initial elemen
  • 尝试在 azure 存储帐户/Blob 上设置 cors 时出现无尽错误

    我正在尝试在 azure 存储 blob 帐户上设置 cors 我已向该帐户添加了 CDN 原因是这样我可以从那里提供网络字体并获取缓存 我已经安装了 nuget 的最新软件 已成功将 Microsoft Data Services Cli
  • 创建具有多个页面的 Apex 表单

    我正在尝试制作一个包含多个 页面 的顶点表单 以便我可以实现漂亮的布局 例如 第 1 页 个人详细信息 gt gt 第 2 页 职业 gt gt 第 3 页 职业经历 gt gt 提交 有没有一种方法可以在不一次提交一页的情况下执行此操作
  • 读取 Storm 集群中的 AWS SQS 队列时,导致这些 ParseError 异常的原因是什么

    我正在使用 Storm 0 8 1 从 Amazon SQS 队列中读取传入消息 并且在执行此操作时遇到一致的异常 2013 12 02 02 21 38 executor ERROR java lang RuntimeException
  • jetty升级到9后无法运行项目

    我升级到 jetty 9 并在尝试运行该项目时出现以下错误 WARNING Error injecting org eclipse jetty maven plugin JettyRunMojo java lang TypeNotPrese
  • count(distinct) over(按...范围函数分区)

    我想计算不同的yyyydd超过mm 日期 2 天 但是 distinct 函数不能与 over 一起使用 如果我删除不同的 它会给我总计数yyyydd but yyyydd可以有很多重复的 这就是为什么我想添加不同的 这有点类似于count