SQL Server 从列中选择出现次数最多的项,基于日期,频率相同

db2dz4w8  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(151)

假设 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'

中 的 每 一 个
等等 等等 , 对 其他 情况 重复 。
但 肯定 有 更 好 的 方法 来 做 这 件 事 吧 ? 而且 我 不 知道 如何 在 频率 相同 的 情况 下 包括 最近 的 一 个 。
谢谢 你 的 帮助 , 如果 我 的 信息 不 清楚 , 我 很 抱歉 。

mftmpeh8

mftmpeh81#

我试着在Azure Synapse中使用SQL脚本来重现这一点。

  • 创建的样本表如下图所示。
Create  table tab1 (id int, col1 varchar(50), date_column date)
Insert  into tab1 values(1,'a','2021-10-01')
Insert  into tab1 values(1,'a','2021-10-02')
Insert  into tab1 values(1,'a','2021-10-03')
Insert  into tab1 values(2,'b','2021-10-01')
Insert  into tab1 values(2,'c','2021-10-02')
Insert  into tab1 values(2,'c','2021-10-03')
Insert  into tab1 values(3,'a','2021-10-01')
Insert  into tab1 values(3,'b','2021-10-02')
Insert  into tab1 values(3,'Null','2021-10-03')
Insert  into tab1 values(4,'c','2021-10-01')
Insert  into tab1 values(5,'b','2021-10-01')
Insert  into tab1 values(5,'Null','2021-10-02')
Insert  into tab1 values(5,'Null','2021-10-03')

步骤:1

编写查询是为了查找组id col1中的值计数以及id col1的每个组合中的最大日期值。

select
distinct id,col1,
count(*) over (partition by id,col1) as count,
case when col1='Null' then null else max(date_column) over (partition by id,col1) end as max_date
from tab1

步骤:2

在每个id,col1组中按count和max_date列的降序计算行号。当两个或多个值具有相同的频率时,将执行此操作,然后根据最新日期分配值。

select *, row_number() over (partition by id order by count desc, max_date desc) as row_num from
(select
distinct id,col1,
count(*) over (partition by id,col1) as count,
case when col1='Null' then null else max(date_column) over (partition by id,col1) end as max_date
from tab1)q1

步骤:3

筛选row_num=1的行项目,并使用逻辑*most a = Hi,most b = Hello,most c = Welcome,most Null = Unknown*最大列分配值。

完整查询

select id, 
[greatest]=case when col1='a' then 'Hi'
                when col1='b' then 'Hello'
                when col1='c' then 'Welcome'
                else 'Unknown'
                end 
from
(select *, row_number() over (partition by id order by count desc, max_date desc) as row_num from
(select
distinct id,col1,
count(*) over (partition by id,col1) as count,
case when col1='Null' then null else max(date_column) over (partition by id,col1) end as max_date
from tab1)q1
)q2 where row_num=1

输出

通过这种方法,即使频率相同,也可以根据最近的日期更新所需的值。

相关问题