Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 如果使用分组选择count(*)=1,则获取值的最有效方法_Tsql_Group By_Common Table Expression - Fatal编程技术网

Tsql 如果使用分组选择count(*)=1,则获取值的最有效方法

Tsql 如果使用分组选择count(*)=1,则获取值的最有效方法,tsql,group-by,common-table-expression,Tsql,Group By,Common Table Expression,假设我有一个ID为int、值为string的表: ID | VALUE 1 abc 2 abc 3 def 4 abc 5 abc 6 abc 如果我确实选择了value,则应按值对group进行计数(*) VALUE | COUNT abc 5 def 1 现在棘手的部分是,如果count==1,我需要从第一个表中获取该ID。我应该使用CTE吗?正在创建results

假设我有一个ID为int、值为string的表:

ID    |  VALUE
1        abc 
2        abc 
3        def
4        abc
5        abc
6        abc
如果我确实选择了value,则应按值对group进行计数(*)

VALUE   | COUNT
abc       5
def       1
现在棘手的部分是,如果count==1,我需要从第一个表中获取该ID。我应该使用CTE吗?正在创建resultset,我将在其中添加ID字符串==null并在其中运行更新b.ID=a.ID,其中count==1

还是有其他更简单的方法

编辑:

我想要这样的结果表:

ID      VALUE  count
null    abc    5
3       def    1

也许不是最有效的,但类似这样的方法很有效:

SELECT MAX(Id) as ID,Value FROM Table WHERE COUNT(*) = 1 GROUP BY Value

使用GROUPBY时,在GROUPBY语句之后可以使用having子句

所以

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

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

我这样做的方式确实是一个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

如果您的ID值是唯一的,您只需检查最大值(ID)=最小值(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函数不太可能需要任何额外的(明显的)时间。我鼓励您尝试一下。

不。ID列必须分组或聚合才能在“选择”列表中有效。@KeithS使用联接进行简单修复。编辑以添加正确的解决方案。这比我丑陋的联盟要好得多。我为你鼓掌,先生。这种情况是否会对大型查询的性能造成潜在影响?@CrisCarew我检查了性能,并与您的建议进行了比较,结果显示性能更好。你看,我只碰过一次桌子。SQL Server必须为每个组执行计数聚合。要求它在整个过程中执行最小和最大聚合不会对性能产生太大影响。case语句只在执行所有聚合后应用,所以每个组应用一次。我也这么认为。凉豆。今天我通过回答一些问题学到了一些东西。
Select Case When Min(id) = Max(id) Then Min(id) Else Null End As Id,
       Value, Count(*) As [Count]
From   YourTable
Group By Value