假设 ID = {1 , [ ... ] ,5} 且 Col1 = {a , b , c , Null} , 我 有 以下 数据 集 :
| 识别 码|列 1|日期|
| - -| - -| - -|
| 一 个|一 种|2022 年 1 月 10 日|
| 一 个|一 种|2022 年 2 月 10 日|
| 一 个|一 种|2022 年 3 月 10 日|
| 2 个|最 佳|2022 年 1 月 10 日|
| 2 个|C 语言|2022 年 2 月 10 日|
| 2 个|C 语言|2022 年 3 月 10 日|
| 三 个|一 种|2022 年 1 月 10 日|
| 三 个|最 佳|2022 年 2 月 10 日|
| 三 个|空 值|2022 年 3 月 10 日|
| 四 个|C 语言|2022 年 1 月 10 日|
| 五 个|最 佳|2022 年 1 月 10 日|
| 五 个|空 值|2022 年 2 月 10 日|
| 五 个|空 值|2022 年 3 月 10 日|
我 想 按 ID 对 行 进行 分组 , 计算 新 列 以 显示 出现 的 次数 , 并 计算 一 个 新 列 以 显示 字符 串 , 这 取决 于 Col1 的 频率 。 大多 数 a = Hi , 大多 数 b = Hello , 大多 数 c = Welcome , 大多 数 Null = Unknown 。 如果 除 Null 之外 的 多 个 模态 具有 相同 的 频率 , 则 基于 日期 的 最近 模态 获胜 。
下面 是 我 需要 的 数据 集 :
| 识别 码|nb _ a| nb _ b| nb _ c| nb _ 空 值|最 大 的|
| - -| - -| - -| - -| - -| - -|
| 一 个|三 个|第 0 页|第 0 页|第 0 页|你 好|
| 2 个|第 0 页|一 个|2 个|第 0 页|欢迎 光临|
| 三 个|一 个|一 个|第 0 页|一 个|你 好|
| 四 个|第 0 页|第 0 页|一 个|第 0 页|欢迎 光临|
| 五 个|第 0 页|一 个|第 0 页|2 个|不详|
我 必须 在 Dataiku 的 一 个 计算 方法 中 完成 这个 操作 。 group by 由 方法 的 group by 部分 处理 , 而 查询 的 其余 部分 需要 在 方法 的 " 自 定义 聚合 " 部分 中 完成 。 我 在 代码 的 if equality then most recent 部分 遇到 了 麻烦 。
我 的 SQL 代码 如下 所 示 :
CASE WHEN SUM(CASE WHEN Col1 = a THEN 1 ELSE 0) >
SUM(CASE WHEN Col1 = b THEN 1 ELSE 0)
AND SUM(CASE WHEN Col1 = a THEN 1 ELSE 0) >
SUM(CASE WHEN Col1 = c THEN 1 ELSE 0)
THEN 'Hi'
CASE WHEN SUM(CASE WHEN Col1 = b THEN 1 ELSE 0) >
SUM(CASE WHEN Col1 = a THEN 1 ELSE 0)
AND SUM(CASE WHEN Col1 = b THEN 1 ELSE 0) >
SUM(CASE WHEN Col1 = c THEN 1 ELSE 0)
THEN 'Hello'
CASE WHEN SUM(CASE WHEN Col1 = c THEN 1 ELSE 0) >
SUM(CASE WHEN Col1 = a THEN 1 ELSE 0)
AND SUM(CASE WHEN Col1 = c THEN 1 ELSE 0) >
SUM(CASE WHEN Col1 = b THEN 1 ELSE 0)
THEN 'Welcome'
中 的 每 一 个
等等 等等 , 对 其他 情况 重复 。
但 肯定 有 更 好 的 方法 来 做 这 件 事 吧 ? 而且 我 不 知道 如何 在 频率 相同 的 情况 下 包括 最近 的 一 个 。
谢谢 你 的 帮助 , 如果 我 的 信息 不 清楚 , 我 很 抱歉 。
1条答案
按热度按时间mftmpeh81#
我试着在Azure Synapse中使用SQL脚本来重现这一点。
步骤:1
编写查询是为了查找组id col1中的值计数以及id col1的每个组合中的最大日期值。
步骤:2
在每个id,col1组中按count和max_date列的降序计算行号。当两个或多个值具有相同的频率时,将执行此操作,然后根据最新日期分配值。
步骤:3
筛选row_num=1的行项目,并使用逻辑*most a = Hi,most b = Hello,most c = Welcome,most Null = Unknown*为最大列分配值。
完整查询
输出
通过这种方法,即使频率相同,也可以根据最近的日期更新所需的值。