SQL 具有类似条件的分组依据

yig*_*mes 0 sql sql-server group-by where-clause sql-like

假设有一个 SQL 表:testTable,其中包含以下列:clientID、colA、colB、colC。

reference   clientID    colA    colB    colC
---------------------------------------------
001            1        test1   test2   test3
002            1        test1   ball2   test3
003            2        test1   ball2   test3
004            2        test1   ball2   test3
005            3        test1   test2   test3
006            4        test1   test2   test3
007            4        test1   test2   test3
009            5        test1   ball2   test3
---------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我想选择所有不同的行,其中 colB 类似于“test”并按 clientID 进行分组。所以我最终得到:

reference    clientID    colA    colB    colC
----------------------------------------------
001             1        test1   test2   test3
005             3        test1   test2   test3
006             4        test1   test2   test3
----------------------------------------------
Run Code Online (Sandbox Code Playgroud)

编辑:如果我使用 select unique * .. from .. where colB like '%test%' group by clientID 那么返回的结果没有对 clientID 进行分组,则引用列是唯一的

Nen*_*vic 5

当你按一列分组时,你会将多行变成一行,select中的其他列必须是聚合函数或子查询。使用哪个功能取决于您的需要。如果与字符串列一起使用,像下面的示例一样使用 MIN() 将为您提供按字母顺序排列的第一个结果

SELECT clientID
    , MIN(colA) AS colA
    , MIN(colB) AS colB
    , MIN(colC) AS colC
FROM tableA
WHERE colB LIKE '%test%'
GROUP BY clientID
Run Code Online (Sandbox Code Playgroud)

编辑:这是另一个解决方案,不使用 GROUP BY,而是使用 ROW_NUMBER() 的公共表表达式

WITH CTE_Source AS 
(
  SELECT *
  FROM TableA
  WHERE colB LIKE '%test%'
) 
, CTE_Filter AS 
(
   SELECT *, ROW_NUMBER() OVER (PARTITION BY ClientID ORDER BY reference) RN
   FROM CTE_Source 
)
SELECT * 
FROM CTE_Filter 
WHERE RN = 1
Run Code Online (Sandbox Code Playgroud)