我需要在C#Linq中实现以下SQL:
SELECT NTILE (3) OVER (ORDER BY TransactionCount DESC) AS A...
除this之外,我找不到类似问题的任何答案。但是,我认为这不是我想要的。
我什至不知道从哪里开始,如果有人可以,请给我至少一个我很感激的起点。
-编辑-
试图解释好一点。
我有一个带有事务,项目,单位和其他数据的Store X,这些数据是从SQL检索并存储在C#对象中的。
我有一个所有具有相同数据的存储的列表,但是在这种情况下,由于检索到的数据量大(以及其他原因),我从Analysis Services检索了它,并将它们全部存储在C#中的另一个对象中。
所以我需要对列表进行排序,并找出商店X是否在该列表的前四分之一或第二或第三位...
我希望这有助于阐明我要实现的目标。
谢谢
最佳答案
我相信没有NTILE(n)
的简单LINQ等效项。无论如何,根据您的需求写一个并不难。
T-SQL文档说
将有序分区中的行分布到指定数量的组中。这些组从1开始编号。对于每一行,NTILE返回该行所属的组的编号。
(请参见here)
对于NTILE
的非常粗略的实现,可以使用GroupBy
。为了简单起见,下面的示例使用int[]
,但是您当然不限于
int n = 4;
int[] data = { 5, 2, 8, 2, 3, 8, 3, 2, 9, 5 };
var ntile = data.OrderBy(value => value)
.Select((value,index) => new {Value = value, Index = index})
.GroupBy(c => Math.Floor(c.Index / (data.Count() / (double)n)), c => c.Value);
首先,我们的
data
按其值升序排列。如果您使用的不是简单的int
,则可能类似于store => store.Revenue
(假设您希望按商店的收入获取分位数)。此外,我们正在选择有序数据为匿名类型,以包括索引。这是必需的,因为索引对于分组是必需的,但是似乎GroupBy
不像Select
那样支持带索引的lambda。第三行不太直观,但是我将尝试解释:
NTILE
函数分配组,行被分配到。要创建n
组,我们将N
(项目数)乘以n
以获取每个组的项,然后根据该值来配置当前索引,以确定当前项位于哪个组中。为了获得正确的组数,我必须将每个组的项目数取小数,然后计算得出的组数,但是诚然,这是凭经验得出的。ntile
将包含n
个组,每个组的Key
等于组号。每个组都是可枚举的。如果要确定元素是否在第二个四分位数中,则可以检查groups.Where(g => g.Key == 1)
是否包含该元素。备注:我用来确定组的方法可能需要一些微调。
关于c# - C#中的NTILE函数等效项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49022955/