SQL Server查询从每个子组中选择1

thu*_*eek 5 t-sql sql-server sql-server-2008

我有一组数据,需要为每个CON/OWNER/METHOD/MATRIX集提取一条记录.如果存在非空结果,我想要那个.否则,我想要一个COUNT最高的那个.我该如何查询?

CON      OWNER      METHOD      MATRIX  RESULT  COUNT
*CON_1   OWNER_1    METHOD_A    SOLID   NULL    503
CON_1    OWNER_1    METHOD_A    SOLID   NULL    1

*CON_1   OWNER_1    METHOD_A    SOIL    NULL    1305
CON_1    OWNER_1    METHOD_A    SOIL    NULL    699

*CON_2   OWNER_2    METHOD_B    SOLID   290     687
CON_2    OWNER_2    METHOD_B    SOLID   NULL    NULL
CON_2    OWNER_2    METHOD_B    SOLID   450     600

CON_2    OWNER_2    METHOD_B    WATER   NULL    1
*CON_2   OWNER_2    METHOD_B    WATER   400     NULL
Run Code Online (Sandbox Code Playgroud)

为了一个结果,我想只有星号记录,我正在展示每组如何分组.

这是不好的SQL:

select top (1) CON, OWNER, METHOD, MATRIX, RESULT, COUNT
from #TempTable
group by CON, OWNER, METHOD, MATRIX
order by CON, OWNER, METHOD, MATRIX, COUNT
Run Code Online (Sandbox Code Playgroud)

...因为我的计数不是聚合函数的一部分.它也不处理RESULT为NULL,并且top(1)不会从每个分组返回1.但是,通过使用更复杂的查询(例如基于如何从子查询中选择多个列(在SQL Server中)的问题,我应该有一个记录(选择前1)的问题)主查询?)

如何从每个分组中选择一个?

Pau*_*sey 11

试试这个,不是100%确定语法是正确的,但它很接近.

select 
    * 
from
    (select
        CON,
        OWNER,
        METHOD,
        MATRIX,
        RESULT,
        COUNT,
        RANK() OVER(PARTITION BY CON, OWNER, METHOD,MATRIX ORDER BY RESULT,COUNT DESC) as rnk
    FROM #TempTable
) a
WHERE rnk = 1
Run Code Online (Sandbox Code Playgroud)