小编Ed *_*d W的帖子

带递归的CTE - row_number()聚合

我有一个父/子关系表和一个引用自己的日期创建列.我想显示每个父记录以及节点上最近的"活动"所排序的所有后代.因此,如果很久以前创建的第1行有一个新的子项添加到其中(或者例如将一个新子项添加到其子项中),那么我希望它位于结果的顶部.

我目前无法正常工作.

我的表结构如下:

CREATE TABLE [dbo].[Orders](
    [OrderId] [int] NOT NULL,
    [Orders_OrderId] [int] NULL,
    [DateOrdered] datetime)
Run Code Online (Sandbox Code Playgroud)

我编写了以下SQL来提取信息:

WITH allOrders AS 
   (SELECT po.orderid, po.Orders_OrderId, po.DateOrdered, 0 as distance,  
   row_number() over (order by DateOrdered desc) as RN1
    FROM orders po WHERE po.Orders_OrderId is null
    UNION ALL
    SELECT b2.orderid ,b2.Orders_OrderId, b2.DateOrdered, c.distance + 1, 
    c.RN1
    FROM orders b2 
    INNER JOIN allOrders c 
    ON b2.Orders_OrderId = c.orderid
    )

SELECT * from allOrders
where RN1 between 0 and 2
order by rn1 asc, distance asc
Run Code Online (Sandbox Code Playgroud)

有什么方法可以"聚合"递归选择的结果,这样我就可以选择整个"父"节点的最大日期? …

sql t-sql sql-server recursion

10
推荐指数
1
解决办法
4252
查看次数

使用linq从List <T>中删除连续重复项

我正在寻找一种方法来防止重复列表中的项目但仍保留订单.例如

1, 2, 3, 4, 4, 4, 1, 1, 2, 3, 4, 4 
Run Code Online (Sandbox Code Playgroud)

应该成为

1, 2, 3, 4, 1, 2, 3, 4
Run Code Online (Sandbox Code Playgroud)

我使用for循环非常优雅地完成它,检查下一项如下

    public static List<T> RemoveSequencialRepeats<T>(List<T> input) 
    {
        var result = new List<T>();

        for (int index = 0; index < input.Count; index++)
        {
            if (index == input.Count - 1)
            {
                result.Add(input[index]);
            }
            else if (!input[index].Equals(input[index + 1]))
            {
                result.Add(input[index]);
            }
        }

        return result;
    }
Run Code Online (Sandbox Code Playgroud)

是否有更优雅的方式来做到这一点,最好是LINQ?

c# linq

7
推荐指数
3
解决办法
1408
查看次数

标签 统计

c# ×1

linq ×1

recursion ×1

sql ×1

sql-server ×1

t-sql ×1