0

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

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

问题是只返回每个代码第一次出现的行。所以对于这个例子,应该返回第一行、第四行和第五行。它“感觉”就像一个 group by code 可以做到这一点,但我无法弄清楚 group by 的条件,它将为每个代码选择具有最低 pos 的行。查询解决方案只需要适用于 ms sqlserver。

4

3 回答 3

3
select doc, code, min(pos) as pos
from t
group by doc, code
于 2013-06-25T22:04:13.890 回答
1
SELECT doc, MIN(pos),code       
FROM Table1
group by doc, code

演示: SQL 小提琴

于 2013-06-25T22:04:34.967 回答
1

假设您使用的是支持窗口函数的 rdbms ROW_NUMBER,这里是一个在 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

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

演示

您可能想用 替换ROW_NUMBERDENSE_RANK自己看看:

排名函数 (Transact-SQL)

于 2013-06-25T22:06:20.850 回答