sql - 用于标记表中此特定条件至少出现一次或多次的行的 Sql 语法
问题描述
我正在使用 SQL Server 2014,并且我有一个表 (t1),其中包含超过 25,000 行中的 6 个数字的列表。
t1 的摘录如下:
Id F1 F2 F3 F4 F5 F6
1 5 11 15 21 30 36
2 8 10 21 25 32 39
3 10 18 23 27 28 32
...
我想写 2 个案例陈述来执行以下操作:
- (1) 将 6 个数字(F1 到 F6)的最后一位数字至少出现一次或多次的行标记为“是”,(否则为“否”)
- (2) 给出所有数字的计数(基于上述条件(1)),否则给出零
这是我期望的输出:
Id F1 F2 F3 F4 F5 F6 LastDigit CountLastDigit
1 5 11 15 21 30 36 Yes 4
2 8 10 21 25 32 39 No 0
3 10 18 23 27 28 32 Yes 2
...
我坚持编写 2 个案例陈述背后的逻辑。任何帮助,将不胜感激。
解决方案
这是一个有趣的问题。您可以通过横向连接来做到这一点。这个想法是将数字列转换为行,按最后一位聚合并仅保留最常出现的数字。然后你只需要添加一点条件逻辑:
select *
from mytable t
cross apply (
select top (1)
case when count(*) = 1 then 'No' else 'Yes' end LastDigit,
case when count(*) = 1 then 0 else count(*) end CountLastDigit
from (values(f1), (f2), (f3), (f4), (f5), (f6)) x(f)
group by f % 10
order by CountLastDigit desc
) z
身份证 | F1 | F2 | F3 | F4 | F5 | F6 | 最后一位 | CountLastDigit -: | -: | -: | -: | -: | -: | -: | :-------- | -------------: 1 | 5 | 11 | 15 | 21 | 30 | 36 | 是 | 2 2 | 8 | 10 | 21 | 25 | 32 | 39 | 没有 | 0 3 | 10 | 18 | 23 | 27 | 28 | 30 | 是 | 2
如果您想对顶级关系的计数求和,则在子查询中需要多一层聚合:
select *
from mytable t
cross apply (
select
max(LastDigit) LastDigit,
sum(CountLastDigit) CountLastDigit
from (
select top (1) with ties
case when count(*) = 1 then 'No' else 'Yes' end LastDigit,
case when count(*) = 1 then 0 else count(*) end CountLastDigit
from (values(f1), (f2), (f3), (f4), (f5), (f6)) x(f)
group by f % 10
order by CountLastDigit desc
) z
) z
推荐阅读
- java - 使用应用程序打包 OpenJFX
- javascript - 在返回范围内打印参数值
- database - 将带有 2 个表的 CSV 覆盖到 SQLite
- python - Pandas 数据框:如何按多值列将一行拆分为多行?
- javascript - 为什么不在 Phaser 中上传图像?
- powershell - 为什么这个 PowerShell 函数的默认参数会根据 . 或 & 在其中调用命令?
- c# - 如何从 .net 核心后端为 Angular 7 获取预渲染的 html 页面?
- vue.js - 在 webpack 4 上运行生产构建后 Vuetify 数据应用程序
- python - 在 Python 中生成 pdf 文件校验和时排除元数据
- javascript - React:使用 async/await 提交表单后获取数据