这可以通过group by子句来完成吗?

时间:2013-06-25 22:01:38

标签: sql group-by

我正在重构一个文档处理应用程序,我想我有机会用一个查询替换大量代码。 db表包含文档中每次出现字典术语的行。行包含字典条目的第一个字母的文档中的字符位置以及与字典术语相关联的代码编号。例如,此处是处理单个文档所产生的一组行。

doc        pos        code
55          20          44
55         169          44
55         328          44
55          86         174
55          98         393
55         566         393

问题是只返回每个代码第一次出现的行。因此,对于此示例,应返回第一行,第四行和第五行。它感觉就像一个代码组可以做到这一点,但我无法弄清楚组的条件是选择每个代码的pos最低的行。 查询解决方案只需要用于ms sqlserver。

3 个答案:

答案 0 :(得分:3)

select doc, code, min(pos) as pos
from t
group by doc, code

答案 1 :(得分:1)

SELECT doc, MIN(pos),code       
FROM Table1
group by doc, code

演示:SQL Fiddle

答案 2 :(得分:1)

假设您正在使用支持ROW_NUMBER等窗口函数的rdbms,这里有一个在sql-server 2005向上工作的示例:

WITH CTE AS
(
    SELECT doc, pos, code, 
           RN = ROW_NUMBER()OVER(PARTITION BY doc,code Order By pos)
    from dbo.TableName
)
SELECT doc, pos, code
FROM CTE
WHERE RN = 1

窗口功能的优点是它比GROUP BY更易于维护和维护,您可以轻松更改顺序或添加其他窗口功能。您还可以在聚合函数上使用OVER子句,例如:SUM(doc)OVER(PARTITION BY code),您可以包含所有列,而无需将其添加到group-by或应用聚合函数。

DEMO

您可能希望将ROW_NUMBER替换为DENSE_RANK,自己看看:

Ranking Functions (Transact-SQL)