我在为我的问题寻找解决方案时遇到了一些问题,可能是因为我真的不知道如何表达它。
我需要从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 - 由于更高的分数。
答案 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)) + ',%';