Select 行值基于另一行中的值
Select Row values based on values in another row
我有一个 table,它有一个自动递增的标识 "Reference" 字段和一对确定排序顺序的其他字段。我需要做的是在 table 中找到 'next' 项目,当基于初始项目的参考字段对字段进行排序时。
所以我的数据按 SortParent.SortChild 排序时看起来像这样:
Reference SortParent SortChild Data
------------------------------------------
9 1 2 Fred
7 1 3 Jim
11 1 4 Sheila
4 2 1 Micro
5 2 2 Archimedes
12 2 3 Electron
所以在这个例子中,"Jim" 行 (Reference=7) 出现在 "Fred" (Reference=9) 之后,即使它的引用较小。
所以我希望能够根据 Jim 的参考资料进行搜索,找到 Fred 之后的哪一行
目前在代码中我执行查询以查找 Fred 行的值:
SELECT SortParent,SortChild From MyTable WHERE Reference=9
其中 returns 1,2。然后搜索 1,2:
之后的第一行
SELECT * FROM MyTable
WHERE ((SortParent=1 and SortChild>2) OR (SortParent>2))
ORDER BY SortParent,SortChild
因此将返回具有引用 7 和排序值 1,3 的行
我很确定这可以在一个查询中完成,但我很难找到最好的方法。
顺便说一句,如果有人对处理两部分排序列的替代方法有任何建议,可以使这更容易,请随时提供帮助!
我相信您正在查看 LEAD 或 LAG 窗口函数:
https://msdn.microsoft.com/en-US/library/hh213125.aspx
SELECT
NextReference
FROM
(SELECT
reference
, LEAD(reference, 1,0) OVER (ORDER BY SortParent,SortChild) AS NextReference
, *
FROM
mytable
) newTable
WHERE
reference = 9
我使用了 LEAD,但如果您从另一个方向寻找该行,请尝试使用 LAG
我还没有测试过这个特定的查询,所以我的语法不合理,但是如果你有任何问题请告诉我,我回到办公桌后会再检查一下
编辑:使用错误的 sql 作为我的基础
EDIT2:将线索放入子查询中以允许我们对其进行查询
我有一个 table,它有一个自动递增的标识 "Reference" 字段和一对确定排序顺序的其他字段。我需要做的是在 table 中找到 'next' 项目,当基于初始项目的参考字段对字段进行排序时。
所以我的数据按 SortParent.SortChild 排序时看起来像这样:
Reference SortParent SortChild Data
------------------------------------------
9 1 2 Fred
7 1 3 Jim
11 1 4 Sheila
4 2 1 Micro
5 2 2 Archimedes
12 2 3 Electron
所以在这个例子中,"Jim" 行 (Reference=7) 出现在 "Fred" (Reference=9) 之后,即使它的引用较小。
所以我希望能够根据 Jim 的参考资料进行搜索,找到 Fred 之后的哪一行
目前在代码中我执行查询以查找 Fred 行的值:
SELECT SortParent,SortChild From MyTable WHERE Reference=9
其中 returns 1,2。然后搜索 1,2:
之后的第一行SELECT * FROM MyTable
WHERE ((SortParent=1 and SortChild>2) OR (SortParent>2))
ORDER BY SortParent,SortChild
因此将返回具有引用 7 和排序值 1,3 的行
我很确定这可以在一个查询中完成,但我很难找到最好的方法。
顺便说一句,如果有人对处理两部分排序列的替代方法有任何建议,可以使这更容易,请随时提供帮助!
我相信您正在查看 LEAD 或 LAG 窗口函数:
https://msdn.microsoft.com/en-US/library/hh213125.aspx
SELECT
NextReference
FROM
(SELECT
reference
, LEAD(reference, 1,0) OVER (ORDER BY SortParent,SortChild) AS NextReference
, *
FROM
mytable
) newTable
WHERE
reference = 9
我使用了 LEAD,但如果您从另一个方向寻找该行,请尝试使用 LAG
我还没有测试过这个特定的查询,所以我的语法不合理,但是如果你有任何问题请告诉我,我回到办公桌后会再检查一下
编辑:使用错误的 sql 作为我的基础
EDIT2:将线索放入子查询中以允许我们对其进行查询