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)