0

假设我有 ID 为 int、VALUE 字符串的表:

ID    |  VALUE
1        abc 
2        abc 
3        def
4        abc
5        abc
6        abc

如果我选择值,count(*) 按值分组,我应该得到

VALUE   | COUNT
abc       5
def       1

现在棘手的部分,如果有 count == 1 我需要从第一个表中获取该 ID。我应该使用 CTE 吗?创建结果集,我将在其中添加 ID string == null 并运行 update b.ID = a.ID where count == 1 ?

或者还有其他更简单的方法吗?

编辑:

我想要这样的结果表:

ID      VALUE  count
null    abc    5
3       def    1
4

4 回答 4

3

如果您的 ID 值是唯一的,您可以简单地检查一下 max(id) = min(id)。如果是这样,则使用其中之一,否则您可以返回 null。像这样:

Select Case When Min(id) = Max(id) Then Min(id) Else Null End As Id,
       Value, Count(*) As [Count]
From   YourTable
Group By Value

由于您已经在执行聚合,包括 MIN 和 Max 函数不太可能花费任何额外(显着)时间。我鼓励你试一试。

于 2012-04-04T22:21:48.690 回答
0

使用 group by 时,可以在 group by 语句之后使用 having 子句。

所以

SELECT [ID]
FROM table
GROUP BY [VALUE]
HAVING COUNT(*) = 1

编辑:关于您编辑的问题:这使用了一些有趣的连接和联合

CREATE TABLE #table
(ID int IDENTITY,
VALUE varchar(3))

INSERT INTO #table (VALUE)
VALUES('abc'),('abc'),('def'),('abc'),('abc'),('abc')

    SELECT * FROM (
    SELECT Null as ID,VALUE, COUNT(*) as [Count]
    FROM #table
    GROUP BY VALUE
    HAVING COUNT(*) > 1
UNION ALL
    SELECT t.ID,t.VALUE,p.Count FROM
    #table t
    JOIN
    (SELECT VALUE, COUNT(*) as [Count]
    FROM #table
    GROUP BY VALUE
    HAVING COUNT(*) = 1) p
    ON t.VALUE=p.VALUE
) a



DROP TABLE #table
于 2012-04-04T22:00:37.330 回答
0

我这样做的方式确实是 CTE:

using @group AS (SELECT value, Count(*) as count from MyTable GROUP BY value HAVING count = 1)
SELECT MyTable.ID, @group.value, @group.count from MyTable
   JOIN @group ON @group.value = MyTable.value
于 2012-04-04T22:05:12.130 回答
-1

也许不是最有效的,但这样的工作:

SELECT MAX(Id) as ID,Value FROM Table WHERE COUNT(*) = 1 GROUP BY Value
于 2012-04-04T22:00:10.407 回答