gpt4 book ai didi

c# - C# 中的 NTILE 函数等效项

转载 作者:行者123 更新时间:2023-12-03 04:22:17 24 4
gpt4 key购买 nike

我需要在 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 文档说

Distributes the rows in an ordered partition into a specified number of groups. The groups are numbered, starting at one. For each row, NTILE returns the number of the group to which the row belongs.

(参见 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);

首先,我们的数据按其值升序排列。如果您不使用简单的int,这可能类似于store => store.Revenue(假设您希望通过商店收入获取分位数)。此外,我们将有序数据选择为匿名类型,以包含索引。这是必要的,因为索引对于分组是必要的,但似乎 GroupBy 不支持带有索引的 lambda,而 Select 则支持。

第三行有点不太直观,但我会尝试解释:NTILE 函数分配组,将行分配到。要创建 n 个组,我们将 N(项目数)除以 n 来获取每个组的项目,然后通过该值来设置当前索引,确定当前项目属于哪个组。为了获得正确的组数,我必须将每组的项目数设置为小数,并将计算出的组数下限,但不可否认,这是相当经验性的。

ntile 将包含 n 个组,每个组的 Key 等于组号。每个组都是可枚举的。如果您想确定某个元素是否位于第二个四分位数,可以检查 groups.Where(g => g.Key == 1) 是否包含该元素。

备注:我用来确定组的方法可能需要一些微调。

关于c# - C# 中的 NTILE 函数等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49022955/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com