首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Linq C#中使用分区?

如何在Linq C#中使用分区?
EN

Stack Overflow用户
提问于 2020-10-16 21:05:46
回答 2查看 152关注 0票数 3

我有下面的SQL表,其中我需要为每种货币选择一个顶级兑换

代码语言:javascript
复制
Currency  Exchange Date
USD       NewYork  01/12/20
USD       NewYork  01/11/20
USD       NewYork  01/10/20
USD       Montreal 01/10/20
CAD       Montreal 01/07/20
CAD       Montreal 01/06/20
CAD       Beijing  01/06/20

我正在使用这个使用分区的查询

代码语言:javascript
复制
select distinct currency,
       first_value(exchange) over (partition by currency order by count(*) desc) exchange,
       max(count(*)) over (partition by currency) frequency
from tablename
group by currency, exchange

结果

代码语言:javascript
复制
Currency Exchange Frequency 
USD      NewYork  3
CAD      Montreal 2 

我需要在Linq中实现这一点

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-16 21:32:31

尝试以下操作:

代码语言:javascript
复制
DataTable dt = new DataTable();
dt.Columns.Add("Currency", typeof(string));
dt.Columns.Add("Exchange", typeof(string));
dt.Columns.Add("Date", typeof(DateTime));

dt.Rows.Add(new object[] {"USD", "NewYork", DateTime.Parse("01/12/20")});
dt.Rows.Add(new object[] {"USD", "NewYork", DateTime.Parse("01/11/20")});
dt.Rows.Add(new object[] {"USD", "NewYork", DateTime.Parse("01/10/20")});
dt.Rows.Add(new object[] {"USD", "Montreal", DateTime.Parse("01/10/20")});
dt.Rows.Add(new object[] {"CAD", "Montreal", DateTime.Parse("01/07/20")});
dt.Rows.Add(new object[] {"CAD", "Montreal", DateTime.Parse("01/06/20")});
dt.Rows.Add(new object[] { "CAD", "Beijing", DateTime.Parse("01/06/20") });

var results = dt.AsEnumerable()
    .GroupBy(x => x.Field<string>("Currency"))
    .Select(x =>
        x.GroupBy(y => y.Field<string>("Exchange"))
            .Select(z =>
                new
                {
                    Currency = x.Key,
                    Exchange = z.Key,
                    Frequency = z.Count()
                })
            .OrderByDescending(z => z.Frequency)
            .First()
    ).ToList();
票数 2
EN

Stack Overflow用户

发布于 2020-10-16 22:25:17

运行此查询(来自jdweng的答案)

代码语言:javascript
复制
Exchanges.GroupBy(x => x.Field<string>("Currency"))
    .Select(x =>
        x.GroupBy(y => y.Field<string>("Exchange"))
            .Select(z =>
                new
                {
                    Currency = x.Key,
                    Exchange = z.Key,
                    Frequency = z.Count()
                })
            .OrderByDescending(z => z.Frequency)
            .First()
    ).ToList()

在LINQPad中导致

代码语言:javascript
复制
+----------+----------+-----------+
| Currency | Exchange | Frequency |
+----------+----------+-----------+
| USD      | New York |         3 |
| CAD      | Montreal |         2 |
+----------+----------+-----------+

这就是生成的SQL

代码语言:javascript
复制
SELECT [t4].[test], [t1].[Currency], [t4].[Exchange], [t4].[value] AS [Frequency]
FROM (
    SELECT [t0].[Currency]
    FROM [Exchanges] AS [t0]
    GROUP BY [t0].[Currency]
    ) AS [t1]
OUTER APPLY (
    SELECT TOP (1) 1 AS [test], [t3].[Exchange], [t3].[value]
    FROM (
        SELECT COUNT(*) AS [value], [t2].[Exchange]
        FROM [Exchanges] AS [t2]
        WHERE (([t1].[Currency] IS NULL) AND ([t2].[Currency] IS NULL)) OR (([t1].[Currency] IS NOT NULL) AND ([t2].[Currency] IS NOT NULL) AND ([t1].[Currency] = [t2].[Currency]))
        GROUP BY [t2].[Exchange]
        ) AS [t3]
    ORDER BY [t3].[value] DESC
    ) AS [t4]
ORDER BY [t4].[value] DESC
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64389753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档