- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 SQL Server 中,我尝试按 id 对匹配行进行分组。 Null 被视为通配符。
说明:匹配行是什么意思?
匹配行意味着——只要两行的所有列都匹配。
匹配列平均值 - 每个值具有相同值 ('A' = 'A') 或空值 ('A'/'B'/'C'/... = NULL)。
在我的例子中:
第 1 行与第 2 行匹配 - 因为:
First column: 'A' = 'A'
Second column: 'B' = NULL
Third column: NULL = 'C'
第 1 行与第 4 行不匹配:
First column: 'A' = 'A'
Second column: 'B' != 'D'
Third column: NULL = NULL.
比较失败,因为第二列中的值不匹配。
谁能帮我解决 SQL 问题吗?
例如:
用于创建测试表:
create table test_table
(
id int,
column1 varchar(20),
column2 varchar(20),
column3 varchar(20)
);
insert into test_table (id, column1, column2, column3) values
(1, 'A', 'B', NULL),
(2, 'A',NULL, 'C'),
(3, 'A', 'B', 'D'),
(4, NULL, 'D', NULL),
(5, 'A', 'B', 'D');
以表格为例
这是预期的结果:
group id 1: {1,2}
group id 2: {1,3,5}
group id 3: {2,4}
这些行无法加入一个组:{1,2,3}。
表格中的预期结果示例:
我尝试过这个答案:
SELECT
T1.id as row_id,
T2.id as row_id
FROM
test_table AS T1
INNER JOIN test_table AS T2 ON
(T1.column1 = T2.column1 OR T1.column1 IS NULL OR T2.column1 IS NULL) AND
(T1.column2 = T2.column2 OR T1.column2 IS NULL OR T2.column2 IS NULL) AND
(T1.column3 = T2.column3 OR T1.column3 IS NULL OR T2.column3 IS NULL)
WHERE
T1.id < T2.id
所以我可以看到第 1 行与第 2、3、5 行匹配 - 但我看不到第 2 行和 3/5 行无法加入同一组。我想要的是一个结果,我可以看到第 1,3,5 行可以在同一组中,因为它们都匹配,但第 1 行和第 2 行之间的匹配需要在其他组中,因为第 2 行与行不匹配3 和 5。
最佳答案
您可以尝试以下方法:
column1
、column2
和 column3
中的所有不同值。这些值可能是列中 NULL
值的候选值。NULL
值的所有可能组合DENSE_RANK()
生成组编号声明:
;WITH ValuesCTE ([column]) AS (
SELECT column1 FROM #test_table WHERE column1 IS NOT NULL
UNION
SELECT column2 FROM #test_table WHERE column2 IS NOT NULL
UNION
SELECT column3 FROM #test_table WHERE column3 IS NOT NULL
), ReplaceCTE AS (
SELECT
t.id,
CASE WHEN t.column1 IS NULL THEN c1.[column] ELSE t.column1 END AS column1,
CASE WHEN t.column2 IS NULL THEN c2.[column] ELSE t.column2 END AS column2,
CASE WHEN t.column3 IS NULL THEN c3.[column] ELSE t.column3 END AS column3
FROM #test_table t
LEFT JOIN ValuesCTE c1 ON t.column1 IS NULL
LEFT JOIN ValuesCTE c2 ON t.column2 IS NULL
LEFT JOIN ValuesCTE c3 ON t.column3 IS NULL
), DuplicatesCTE AS (
SELECT column1, column2, column3
FROM ReplaceCTE
GROUP BY column1, column2, column3
HAVING COUNT(*) > 1
)
SELECT
r.id,
DENSE_RANK() OVER (ORDER BY r.column1, r.column2, r.column3) AS grp
FROM ReplaceCTE r
RIGHT JOIN DuplicatesCTE d ON (r.column1 = d.column1) AND (r.column2 = d.column2) AND (r.column3 = d.column3)
输出:
id grp
1 1
2 1
1 2
3 2
5 2
2 3
4 3
关于sql-server - SQL Server 分组将 null 视为等于所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54850490/
将“”转换为“>”的主要目的是避免以下内联脚本: var foo = "alert('bug');"; // the value of foo is generated from server
我有以下想法: 在德语中我们有四个额外的字母(ä、ö、ü、ß),我不知道任何其他语言有这些声音,但我认为有口音的法国人也知道这个问题。我们在 Google Play 商店中有很多适用于城市、公交车站、
#!/bin/bash read nameArg find -name "$nameArg" 使用此代码,当我输入例如 *.txt 时,它将为我提供以 txt 结尾的所有文件,但我只想要名称为 *.t
我在 MySQL 5.7.27 中有一个带有 utf8mb4_unicode_ci 排序规则的用户表。 不幸的是, ı 没有像 i 那样进行线程化,例如,以下查询将找不到 Yılmaz select
我的简单 MySQL 查询: SELECT `word` FROM `nouns` WHERE `word` LIKE 'vandenys' 返回: vandenis 但是“vandenYs
虽然我以前用过这样的代码,而且很明显编译器有足够的信息可以工作,但我真的不明白为什么会这样编译: template auto foo(const T& t, I i) { return st
如何实现一个以 int 开头的函数,并在每次(经历有限数量的可能性)返回 1 的几个(例如,5 个) bool 值之一时从中减去 1。 理想情况下的外观是: function list1 list2
因此,如果我的数据库中有一个包含值的表 1 2 3 4 NULL 我执行了查询 SELECT MAX(col1) FROM 我会得到 4。有什么办法可以改变这个,所以 Null 将被视为最大值而不是
例如:我在数据库中有一条记录:[Example] Attena Illusive - 01 [720p].mkv尝试使用查询进行搜索: SELECT ts_rank_cd(to_tsvector('
我试图创建 2 个简单的盒子,并允许用户从 1 个盒子中选择数据,然后将其复制到第二个盒子。如果第二个框中已经有相同的文本,请在后面附加一些简单的文本。 它基本上在该项目不在第二个框中时起作用。但是,
这个问题已经有答案了: How to read a file from jar in Java? (6 个回答) 已关闭10 年前。 我想从我的 *jar 存档中读取文件。我在互联网上阅读了如何从 z
我在 Javascript 中偶然发现了一个我无法理解的极其奇怪的事件。 这是一个非常简单的 if 语句: let hours = 20; 我在这里设置了一个断点,并在调试器中设置了hours = 0
这两个查询给出了完全相同的结果: select * from topics where name='Harligt'; select * from topics where name='Härligt
我有一个包含数值和 NaN 的表格。求和时,如果所选值包含 NaN,则结果将为 NaN。有没有办法让 postgresql 在求和时将它们视为 0 而不是 NaN?或者我只需要将表中的所有 NaN 转
我有一个正在构建的页面,我希望当我滚动(向上或向下)页面时滚动到下一个 div(每个 div 是窗口高度的 100%)。并在那里“固定”,直到您再次滚动。可以在此处看到我正在努力完成的示例: http
我正在用 Javascript 制作一个小的 HTML 页面。它不需要服务器端,但我需要存储这个人所做的事情,所以我正在使用 localStorage。( list ) 如今,浏览器可以选择不存储 c
这两个查询给了我完全相同的结果: select * from topics where name='Harligt'; select * from topics where name='Härligt
我想向 Lua 公开一些 C++ 类。我可以调用Widget:New()获取带有元表集的返回用户数据到表 WidgetMeta . WidgetMeta包含所有 C++ 函数,它是 __index设置
我正在使用一个大型的旧数据库,现在我尝试使用 hibernate 而不是 SQL 来访问它。更大的问题之一是在外键中无限制地使用“0”和“-1”(意思是“NULL”)。 我生成了很多代码,但我手动添加
我试图将一个数字传递到一个 BYTES 数组中 - 但将该数字视为一个字符数组。这是我的代码: for(int i=1;i<=totalFiles;i++) { BYTE* input = n
我是一名优秀的程序员,十分优秀!