0

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

我需要从 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

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

对于所有返回的 ID,Column2 的值必须相同。

返回值示例:

ID 
2
3
4

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

这可能需要使用存储过程进行?或者有可能把它作为一个视图?

我在stackoverflow和google中搜索的最接近的是: Selecting entries that are numericly 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 - 由于更高的分数。

4

1 回答 1

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)) + ',%';
于 2013-09-11T20:06:29.397 回答