我有一个父/子关系表和一个引用自己的日期创建列.我想显示每个父记录以及节点上最近的"活动"所排序的所有后代.因此,如果很久以前创建的第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)
有什么方法可以"聚合"递归选择的结果,这样我就可以选择整个"父"节点的最大日期? …
我正在寻找一种方法来防止重复列表中的项目但仍保留订单.例如
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?