选择某些记录在一列中具有重复值的行



我想从一个表中检索所有行,其中有一些记录具有重复的列,但对于这些情况,我必须只选择一行。

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的记录集中选择任何行
  • 只有列idPRIMARY KEY
  • 可以是具有text = NULLstringIdentifier = 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
空空
idtext字符串标识符
1示例TEXT1
2示例TEXT2
示例TEXT3X13UIWF
6示例TEXT4A78BCTK
8
9
SELECT * FROM table
WHERE id IN
(
SELECT MIN(id) FROM table
GROUP BY text, stringIdentifier
);

在这里,我们选择第二条语句(括号中的语句(中ID所在的行。第二条语句是按textstringIdentifier对行进行分组,然后从每个分组中选择MIN(id)或最小ID值。由于每个text/stringIdentifier配对只有一个最小ID值,因此我们最终得到了唯一的行。

如果您想保留text为NULL和stringIdentifier为NULL的所有行,您可以将其添加到末尾:

OR (text IS NULL AND stringIdentifier IS NULL);

相关内容

  • 没有找到相关文章

最新更新