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 进行分组,则引用列是唯一的
当你按一列分组时,你会将多行变成一行,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)
| 归档时间: |
|
| 查看次数: |
3605 次 |
| 最近记录: |