我想从一个表中检索所有行,其中有一些记录具有重复的列,但对于这些情况,我必须只选择一行。
Example:
-------------------------------------------
| id | text | stringIdentifier |
|-------------------------------------------
| 1 | exampleTEXT1 | NULL |
| 2 | exampleTEXT2 | NULL |
| 3 | exampleTEXT3 | X13UIWF |
| 4 | exampleTEXT3 | X13UIWF |
| 5 | exampleTEXT3 | X13UIWF |
| 6 | exampleTEXT4 | A78BCTK |
| 7 | exampleTEXT4 | A78BCTK |
| 8 | NULL | NULL |
| 9 | NULL | NULL |
-------------------------------------------
Expected output:
-------------------------------------------
| id | text | stringIdentifier |
|-------------------------------------------
| 1 | exampleTEXT1 | NULL |
| 2 | exampleTEXT2 | NULL |
| 3 | exampleTEXT3 | X13UIWF |
| 6 | exampleTEXT4 | A78BCTK |
| 8 | NULL | NULL |
| 9 | NULL | NULL |
-------------------------------------------
注:
- 我可以从具有相同
stringIdentifier
的记录集中选择任何行 - 只有列
id
是PRIMARY KEY
- 可以是具有
text = NULL
和stringIdentifier = NULL
的行
提前感谢。
我们可以使用rank()
只选择由id
排序的第一次,其中出现任何text
。
select id
,text
,stringidentifier
from (
select *
,rank() over(partition by text order by id) as rnk
from t
) t
where rnk = 1
or text is null
id | text | 字符串标识符 |
---|---|---|
1 | 示例TEXT1 | 空 |
2 | 示例TEXT2 | 空 |
示例TEXT3 | X13UIWF | |
6 | 示例TEXT4 | A78BCTK |
8 | 空 | 空|
9 | 空 | 空
SELECT * FROM table
WHERE id IN
(
SELECT MIN(id) FROM table
GROUP BY text, stringIdentifier
);
在这里,我们选择第二条语句(括号中的语句(中ID所在的行。第二条语句是按text
和stringIdentifier
对行进行分组,然后从每个分组中选择MIN(id)
或最小ID值。由于每个text/stringIdentifier
配对只有一个最小ID值,因此我们最终得到了唯一的行。
如果您想保留text
为NULL和stringIdentifier
为NULL的所有行,您可以将其添加到末尾:
OR (text IS NULL AND stringIdentifier IS NULL);