SQL Server:获取许多在数值上彼此接近的值

时间:2013-09-11 19:25:18

标签: sql sql-server stored-procedures

我在为我的问题寻找解决方案时遇到了一些问题,可能是因为我真的不知道如何表达它。

我需要从SQL Server数据库的表或视图中获取许多值。

表格如下所示:

ID    Column1   Column2    Column3    Column4
1     1         2          41         5
2     3         2          41         5
3     4         2          41         5
4     5         2          41         5
5     6         2          41         5
6     1         5          41         10
7     2         5          41         10
8     3         5          41         10
9     4         5          41         10

假设我需要从该表返回一行中的3个值(ID),其中column3是某个(已知)值。但是column1中的树值必须在一行中。 (例如ID 2,3和4。)

Column2必须与所有返回的ID相同。

返回值的示例:

ID 
2
3
4

下次我可能需要连续5个值。

这可能需要使用存储过程吗?或者是否可以将其作为一种观点?

我最接近搜索stackoverflow和google是这样的: Selecting entries that are numerically close to each other in a database

有没有人对我的困境有任何好主意?

提前致谢!

//安德烈亚斯

修改:返回值的示例

编辑2: 为了使这更难一点。是否可以在#t - c4中添加另一列? 这将是一种点系统。每一行都有自己的观点。 (1-10) 两个可能的输出可能是ID 2,3,4(总共15个点)和ID 6,7,8(总共30个点)。 但我想要提供的是ID 6,7,8 - 由于更高的分数。

1 个答案:

答案 0 :(得分:0)

试试这个。我将您的数据放入一个名为#t的表中,列为Id,c1,c2,c3,c4。这需要以@targetCount作为参数的存储过程来完成。根据您的后续问题,结果将根据第c4列中的值按“点”加权。

DECLARE @targetCount INT = 3, @idList VARCHAR(MAX);

;WITH cte AS (
    SELECT  CAST(id AS VARCHAR(MAX)) AS IdList, c1, c2, @targetCount AS Lev, c4 as Points
    FROM    #t
    UNION ALL
    SELECT  cte.IdList + ',' + CAST(id AS VARCHAR(MAX)), t.c1, t.c2, cte.Lev - 1, cte.Points + t.c4
    FROM    cte
            JOIN #t t ON cte.c1 + 1 = t.c1 AND cte.c2 = t.c2
    WHERE   cte.Lev >= 1
)
SELECT  TOP 1 @idList = ',' + IdList + ','
FROM    cte
WHERE   Lev = 1
ORDER BY Points DESC;

SELECT  Id
FROM    #t
WHERE   @idList LIKE '%,' + CAST(id AS VARCHAR(MAX)) + ',%';