1: Although a bit messy (you may want to create a Custom Transformation Method to contain this logic)
If(Eval<int>("NodeOrder") > 1, CMS.DocumentEngine.TreeHelper.SelectSingleNode(Eval<int>("NodeParentID")).AllChildren.Where(x => x.NodeOrder == (Eval<int>("NodeOrder")-2)).FirstOrDefault().NodeAliasPath, "")
Since you want to go beyond months, i would recommend you create a custom transformation method since the logic is hard to fit into 1 line, but if you did want to...it would look like tihs mess
CMS.DocumentEngine.DocumentHelper.GetDocuments("CMS.BlogPost").Path(CMS.DocumentEngine.TreeHelper.SelectSingleNode(Eval<int>("NodeID")).Parent.Parent.NodeAliasPath+"/%").OrderBy("BlogPostDate").Where("BlogPostDate > '"+Eval<DateTime>("BlogPostDate").ToString()+"'").Take(1).FirstOrDefault().NodeAliasPath
With the note that the above will ERROR if it's the latest blog post since there isn't one that beyond it, hence why a custom transformation method that can check to see if the object is NULL before calling it's NodeAliasPath would be helpful.