sql - 用 SQL 匹配不替换一到二
问题描述
Name Interest
----------------------
Carol Books
Carol Dancing
Carol Sports
Carol Movies
Carol Music
Sue Books
Sue Dancing
Sue Sports
Sue Music
Sue Painting
SAM Books
SAM Dancing
SAM Sports
SAM Music
SAM Painting
我有一个非常大的数据集。我想为每个名字找到两个不同的兴趣。但是两个人不应该有相同的兴趣。
我希望结果表看起来像这样
Name Interest1 Interest 2
-----------------------------------
Carol Books Sports
Sue Music Painting
SAM Dancing NAN
解决方案
我们可以使用行号来处理这个要求:
WITH names AS (
SELECT DISTINCT Name, ROW_NUMBER() OVER (ORDER BY Name) rn
FROM (SELECT DISTINCT Name FROM yourTable) t
),
interests AS (
SELECT Interest,
ROW_NUMBER() OVER (ORDER BY Interest) rn1,
FLOOR((ROW_NUMBER() OVER (ORDER BY Interest) + 1) / 2) rn2
FROM (SELECT DISTINCT Interest FROM yourTable) t
)
SELECT
n.Name,
MAX(CASE WHEN i.rn1 % 2 = 1 THEN i.Interest END) AS Interest1,
MAX(CASE WHEN i.rn1 % 2 = 0 THEN i.Interest END) AS Interest2
FROM names n
LEFT JOIN interests i
ON n.rn = rn2
GROUP BY
n.Name;
演示
注意:我使用的语法和演示是针对 SQL Server 的,但是上面应该可以在任何支持的 SQL 数据库上运行ROW_NUMBER
,只需稍加修改。
推荐阅读
- c++ - Apriltags3,当标记面向相机时,如何改善姿势模糊?
- android - 当有更多要显示的项目时,回收站视图底部的阴影
- sql - SQL Server 查询:我需要根据查询递增一个整数并设置它
- java - 从 Java 访问时,Scala 公共变为私有?
- php - 使用 withConsecutive() 进行测试时出现问题
- android - 在 Flutter 中以编程方式更改启动画面颜色
- python - Python为所有数据库表生成动态模式
- css - 在 SLOW 计算机上禁用 CSS 过渡
- python-3.x - 如何自定义条形图标签?
- spring - 在带有参数的构造函数上自动装配失败?