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:将线索放入子查询中以允许我们对其进行查询