我正在重构一个文档处理应用程序,我想我有机会用一个查询替换大量代码。 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。
答案 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或应用聚合函数。
您可能希望将ROW_NUMBER
替换为DENSE_RANK
,自己看看: