针对如何根据类型获取最新的每种类型的行并执行计算?和根据类名获取类这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展2021-03-22:小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有
针对如何根据类型获取最新的每种类型的行并执行计算?和根据类名获取类这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展2021-03-22:小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有任意数量。1. 能装下 6 个苹果的袋子,2. 能装下 8 个苹、C # 数据类型获取、C sharp (#) 数据类型获取方式、c# – Entity Framework为每种类型的记录选择最新记录等相关知识,希望可以帮助到你。
本文目录一览:- 如何根据类型获取最新的每种类型的行并执行计算?(根据类名获取类)
- 2021-03-22:小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有任意数量。1. 能装下 6 个苹果的袋子,2. 能装下 8 个苹
- C # 数据类型获取
- C sharp (#) 数据类型获取方式
- c# – Entity Framework为每种类型的记录选择最新记录
如何根据类型获取最新的每种类型的行并执行计算?(根据类名获取类)
我需要一些帮助来编写/优化查询,以按类型检索每行的最新版本,并根据类型执行一些计算。我认为最好举个例子说明一下。
给定以下数据集:
+-------+-------------------+---------------------+-------------+---------------------+--------+----------+| id | event_type | event_timestamp | message_id | sent_at | status | rate |+-------+-------------------+---------------------+-------------+---------------------+--------+----------+| 1 | create | 2016-11-25 09:17:48 | 1 | 2016-11-25 09:17:48 | 0 | 0.500000 || 2 | status_update | 2016-11-25 09:24:38 | 1 | 2016-11-25 09:28:49 | 1 | 0.500000 || 3 | create | 2016-11-25 09:47:48 | 2 | 2016-11-25 09:47:48 | 0 | 0.500000 || 4 | status_update | 2016-11-25 09:54:38 | 2 | 2016-11-25 09:48:49 | 1 | 0.500000 || 5 | rate_update | 2016-11-25 09:55:07 | 2 | 2016-11-25 09:50:07 | 0 | 1.000000 || 6 | create | 2016-11-26 09:17:48 | 3 | 2016-11-26 09:17:48 | 0 | 0.500000 || 7 | create | 2016-11-27 09:17:48 | 4 | 2016-11-27 09:17:48 | 0 | 0.500000 || 8 | rate_update | 2016-11-27 09:55:07 | 4 | 2016-11-27 09:50:07 | 0 | 2.000000 || 9 | rate_update | 2016-11-27 09:55:07 | 2 | 2016-11-25 09:55:07 | 0 | 2.000000 |+-------+-------------------+---------------------+-------------+---------------------+--------+----------+
预期结果应为:
+------------+--------------------+--------------------+-----------------------+| sent_at | sum(submitted_msg) | sum(delivered_msg) | sum(rate_total) |+------------+--------------------+--------------------+-----------------------+| 2016-11-25 | 2 | 2 | 2.500000 || 2016-11-26 | 1 | 0 | 0.500000 || 2016-11-27 | 1 | 0 | 2.000000 |+------------+--------------------+--------------------+-----------------------+
帖子的末尾是用于获取此结果的查询。我愿意打赌,应该有一种优化它的方法,因为它使用的是带有联接的子查询,从我所了解的BigQuery来看,最好避免联接。但是首先要有一些背景:
从本质上讲,数据集表示一个只附加表,在该表中写入了multipe事件。数据的大小是数亿,并且将增长到数十亿以上。由于BigQuery中的Updates不切实际,并且数据正在流式传输到BQ,因此我需要一种方法来检索每个事件的最新事件,根据特定条件执行一些计算并返回准确的结果。该查询是根据用户输入动态生成的,因此可以包含更多字段/计算,但是为简单起见,已将其省略。
- 只有一个
create
事件,但n
有任何其他事件 - 对于每组事件,在进行计算时仅应考虑最新事件。
- status_update-更新状态
- rate_update-更新费率
- 创建-自我解释
- 每个不是的事件都
create
可能不包含原始信息的其余部分/可能不准确(除了message_id和该事件所针对的字段)(简化了数据集,但想象有更多的列,并且更多事件将在以后添加)- 例如,
rate_update
可能设置或未设置状态字段,或者该值不是最终值,因此无法根据rate_update
事件对状态字段进行计算,对于status_update
- 例如,
- 可以假定该表按日期进行了分区,并且每个查询都将使用这些分区。出于简化的目的,目前已经省略了这些条件。
所以我想我有几个问题:
- 如何优化此查询?
- 除了将事件放置
create
在自己的表中之外,将事件放在表中唯一可用的字段是与事件相关的字段,并且是联接所需的字段(message_id,event_timestamp)是否是一个更好的主意?这会减少处理的数据量吗? - 将来添加事件的最佳方法是什么,这将有自己的条件和计算方法?
实际上,关于如何高效,友好地查询此数据集的任何建议都非常受欢迎!谢谢!:)
我想出的怪兽如下。根据INNER JOINS
此资源,用于检索每行的最新版本
select sent_at as sent_at, sum(submitted_msg) as submitted, sum(delivered_msg) as delivered, sum(sales_rate_total) as sales_rate_total FROM ( #DELIVERED SELECT d.message_id, FORMAT_TIMESTAMP(''%Y-%m-%d 00:00:00'', sent_at) AS sent_at, 0 as submitted_msg, sum(if(status=1,1,0)) as delivered_msg, 0 as sales_rate_total FROM `events` d INNER JOIN ( select message_id, max(event_timestamp) as ts from `events` where event_type = "status_update" group by 1 ) g on d.message_id = g.message_id and d.event_timestamp = g.ts GROUP BY 1,2 UNION ALL #SALES RATE SELECT s.message_id, FORMAT_TIMESTAMP(''%Y-%m-%d 00:00:00'', sent_at) AS sent_at, 0 as submitted_msg, 0 as delivered_msg, sum(sales_rate) as sales_rate_total FROM `events` s INNER JOIN ( select message_id, max(event_timestamp) as ts from `events` where event_type in ("rate_update", "create") group by 1 ) f on s.message_id = f.message_id and s.event_timestamp = f.ts GROUP BY 1,2 UNION ALL #SUBMITTED & REST SELECT r.message_id, FORMAT_TIMESTAMP(''%Y-%m-%d 00:00:00'', sent_at) AS sent_at, sum(if(status=0,1,0)) as submitted_msg, 0 as delivered_msg, 0 as sales_rate_total FROM `events` r INNER JOIN ( select message_id, max(event_timestamp) as ts from `events` where event_type = "create" group by 1 ) e on r.message_id = e.message_id and r.event_timestamp = e.ts GROUP BY 1, 2 ) k group by 1
答案1
小编典典如何优化此查询?
尝试以下版本
#standardSQLWITH types AS ( SELECT FORMAT_TIMESTAMP(''%Y-%m-%d'', sent_at) AS sent_at, message_id, FIRST_VALUE(status) OVER(PARTITION BY message_id ORDER BY (event_type = "create") DESC, event_timestamp DESC) AS submitted_status, FIRST_VALUE(status) OVER(PARTITION BY message_id ORDER BY (event_type = "status_update") DESC, event_timestamp DESC) AS delivered_status, FIRST_VALUE(rate) OVER(PARTITION BY message_id ORDER BY (event_type IN ("rate_update", "create")) DESC, event_timestamp DESC) AS sales_rate FROM events), latest AS ( SELECT sent_at, message_id, ANY_VALUE(IF(submitted_status=0,1,0)) AS submitted, ANY_VALUE(IF(delivered_status=1,1,0)) AS delivered, ANY_VALUE(sales_rate) AS sales_rate FROM types GROUP BY 1, 2)SELECT sent_at, SUM(submitted) AS submitted, SUM(delivered) AS delivered, SUM(sales_rate) AS sales_rate_total FROM latestGROUP BY 1
它足够紧凑,可以轻松地进行管理,没有冗余,根本没有任何连接等等。
如果您的表已分区-您只需在一个位置调整查询就可以轻松使用它
如果要先检查低容量的上述查询,则可以使用下面的虚拟数据
WITH events AS ( SELECT 1 AS id, ''create'' AS event_type, TIMESTAMP ''2016-11-25 09:17:48'' AS event_timestamp, 1 AS message_id, TIMESTAMP ''2016-11-25 09:17:48'' AS sent_at, 0 AS status, 0.500000 AS rate UNION ALL SELECT 2 AS id, ''status_update'' AS event_type, TIMESTAMP ''2016-11-25 09:24:38'' AS event_timestamp, 1 AS message_id, TIMESTAMP ''2016-11-25 09:28:49'' AS sent_at, 1 AS status, 0.500000 AS rate UNION ALL SELECT 3 AS id, ''create'' AS event_type, TIMESTAMP ''2016-11-25 09:47:48'' AS event_timestamp, 2 AS message_id, TIMESTAMP ''2016-11-25 09:47:48'' AS sent_at, 0 AS status, 0.500000 AS rate UNION ALL SELECT 4 AS id, ''status_update'' AS event_type, TIMESTAMP ''2016-11-25 09:54:38'' AS event_timestamp, 2 AS message_id, TIMESTAMP ''2016-11-25 09:48:49'' AS sent_at, 1 AS status, 0.500000 AS rate UNION ALL SELECT 5 AS id, ''rate_update'' AS event_type, TIMESTAMP ''2016-11-25 09:55:07'' AS event_timestamp, 2 AS message_id, TIMESTAMP ''2016-11-25 09:50:07'' AS sent_at, 0 AS status, 1.000000 AS rate UNION ALL SELECT 6 AS id, ''create'' AS event_type, TIMESTAMP ''2016-11-26 09:17:48'' AS event_timestamp, 3 AS message_id, TIMESTAMP ''2016-11-26 09:17:48'' AS sent_at, 0 AS status, 0.500000 AS rate UNION ALL SELECT 7 AS id, ''create'' AS event_type, TIMESTAMP ''2016-11-27 09:17:48'' AS event_timestamp, 4 AS message_id, TIMESTAMP ''2016-11-27 09:17:48'' AS sent_at, 0 AS status, 0.500000 AS rate UNION ALL SELECT 8 AS id, ''rate_update'' AS event_type, TIMESTAMP ''2016-11-27 09:55:07'' AS event_timestamp, 4 AS message_id, TIMESTAMP ''2016-11-27 09:50:07'' AS sent_at, 0 AS status, 2.000000 AS rate UNION ALL SELECT 9 AS id, ''rate_update'' AS event_type, TIMESTAMP ''2016-11-27 09:55:07'' AS event_timestamp, 2 AS message_id, TIMESTAMP ''2016-11-25 09:55:07'' AS sent_at, 0 AS status, 2.000000 AS rate )
2021-03-22:小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有任意数量。1. 能装下 6 个苹果的袋子,2. 能装下 8 个苹
2021-03-22:小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有任意数量。1. 能装下 6 个苹果的袋子,2. 能装下 8 个苹果的袋子。小虎可以自由使用两种袋子来装苹果,但是小虎有强迫症,他要求自己使用的袋子数量必须最少,且使用的每个袋子必须装满。给定一个正整数 N,返回至少使用多少袋子。如果 N 无法让使用的每个袋子必须装满,返回 - 1。
福大大 答案 2021-03-22:
1. 自然智慧即可。
N 一定是 2 的倍数,否则两种袋子始终装不满,原因是 6 和 8 的最小公倍数是 2。
先全部装 8 号袋,剩下的苹果装 6 号袋,6 号不满,一个 8 号袋的苹果倒入 6 号袋,直到 6 号袋能装满为止。
2. 根据结果反推,找规律。
N 一定是 2 的倍数,否则两种袋子始终装不满,原因是 6 和 8 的最小公倍数是 2。
N 大于等于 18 时,从 18 开始,8 个数字一组。
N 小于 18 时,直接给出结果。
代码用 golang 编写,代码如下:
package main
import "fmt"
func main() {
for apple := 100; apple <= 120; apple++ {
fmt.Println(apple, " : ", minBages1(apple), " : ", minBages2(apple))
}
}
func minBages1(apple int) int {
if apple < 0 {
return -1
}
bag8 := apple / 8
rest := apple - bag8*8
for bag8 >= 0 {
// rest 个
if rest%6 == 0 {
return bag8 + (rest / 6)
} else {
bag8--
rest += 8
}
}
return -1
}
func minBages2(apple int) int {
if (apple & 1) != 0 { // 如果是奇数,返回-1
return -1
}
if apple < 18 {
if apple == 0 {
return 0
}
if apple == 6 || apple == 8 {
return 1
}
if apple == 12 || apple == 14 || apple == 16 {
return 2
}
return -1
}
return (apple-18)/8 + 3
}
执行结果如下:
***
[左神 java 代码](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class38/Code01_AppleMinBags.java)
[评论](https://user.qzone.qq.com/3182319461/blog/1616367503)
本文分享自微信公众号 - 福大大架构师每日一题(gh_bbe96e5def84)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。
C # 数据类型获取
这里研究一下关于c#
中如何获取变量类型的问题。
- 首先我们研究一下如何获取单个变量的类型
// 问题一:获取单个变量的类型
// 方法一:使用GetType()方法
public static void JudgeType()
{
int element = 5;
// 我们应该知道, GetType()回返回一个类型,因此我们需要用类型变量来存储它
Type type = element.GetType();
// 如果我们需要判断这个类型与其他的类型,比如与int类型,那么我们应该与typeof(int)进行比较
if (type == typeof(int))
{
Console.WriteLine("Is the type of element int? {0}", "Yes");
}
}
// ================================================================================================================
// 方法二:使用is方法
public static void JudgeType()
{
// 这里为了避免warning的出现,我们使用object来定义变量
object element = 5;
// 使用is来直接判断变量的类型
if (element is int)
{
Console.WriteLine("Is the type of element int? {0}", "Yes");
}
}
- 接下来我们研究一下如何获取列表变量的类型
// 问题二: 获取列表的类型
// 方法一:使用GetType()方法
public static void JudgeType()
{
// 创建一个列表对象
var list = new List<int>() {
1, 2 };
Type type = list.GetType();
if (type == typeof(List<int>))
{
Console.WriteLine("Is the type of list List<int>? {0}", "Yes");
}
}
// ================================================================================================================
// 方法二:使用is方法
public static void JudgeType()
{
var list = new List<int>() {
1, 2 };
if (list is List<int>)
{
Console.WriteLine("Is the type of list List<int>? {0}", "Yes");
}
}
// ================================================================================================================
// 方法三:使用GetType()和GetGenericArguments()方法
public static void JudgeType()
{
var list = new List<int>() {
1, 2 };
Type[] type = list.GetType().GetGenericArguments();
if (type[0] == typeof(int))
{
Console.WriteLine("Is the type of list List<int>? {0}", "Yes");
Console.WriteLine("Is the type of element in list int? {0}", "Yes");
}
}
// ================================================================================================================
// 方法四: 使用GetType()和ToString()方法
public static void JudgeType()
{
var list = new List<int>() {
1, 2 };
foreach (var element in list)
{
Type type1 = element.GetType();
if (type1.ToString() == "System.Int32")
{
Console.WriteLine("Is the type of element in list int? {0}", "Yes");
}
}
}
// ================================================================================================================
// 方法五: 使用GetType()和Name方法
public static void JudgeType()
{
var list = new List<int>() {
1, 2 };
string type_ = list[0].GetType().Name;
Console.WriteLine(type_);
if (type_ == "Int32")
{
Console.WriteLine("Is the type of element in list int? {0}", "Yes");
}
}
如果大家觉得有用,请高抬贵手给一个赞让我上推荐让更多的人看到吧~
C sharp (#) 数据类型获取方式
C sharp (#) 数据类型获取
这里研究一下关于c#中如何获取变量类型的问题。
首先我们研究一下如何获取单个变量的类型
// 问题一:获取单个变量的类型 // 方法一:使用GetType()方法 public static void JudgeType() { int element = 5; // 我们应该知道, GetType()会返回一个类型,因此我们需要用类型变量来存储它 Type type = element.GetType(); // 如果我们需要判断这个类型与其他的类型,比如与int类型,那么我们应该与typeof(int)进行比较 if (type == typeof(int)) { Console.WriteLine("Is the type of element int? {0}", "Yes"); } } // ============================================= // 方法二:使用is方法 public static void JudgeType() { // 这里为了避免warning的出现,我们使用object来定义变量 object element = 5; // 使用is来直接判断变量的类型 if (element is int) { Console.WriteLine("Is the type of element int? {0}", "Yes"); } }
接下来我们研究一下如何获取列表变量的类型
// 问题二: 获取列表的类型 // 方法一:使用GetType()方法 public static void JudgeType() { // 创建一个列表对象 var list = new List<int>() { 1, 2 }; Type type = list.GetType(); if (type == typeof(List<int>)) { Console.WriteLine("Is the type of list List<int>? {0}", "Yes"); } } // ============================================= // 方法二:使用is方法 public static void JudgeType() { var list = new List<int>() { 1, 2 }; if (list is List<int>) { Console.WriteLine("Is the type of list List<int>? {0}", "Yes"); } } // ============================================= // 方法三:使用GetType()和GetGenericArguments()方法 public static void JudgeType() { var list = new List<int>() { 1, 2 }; Type[] type = list.GetType().GetGenericArguments(); if (type[0] == typeof(int)) { Console.WriteLine("Is the type of list List<int>? {0}", "Yes"); Console.WriteLine("Is the type of element in list int? {0}", "Yes"); } } // ============================================= // 方法四: 使用GetType()和ToString()方法 public static void JudgeType() { var list = new List<int>() { 1, 2 }; foreach (var element in list) { Type type1 = element.GetType(); if (type1.ToString() == "System.Int32") { Console.WriteLine("Is the type of element in list int? {0}", "Yes"); } } } // ============================================= // 方法五: 使用GetType()和Name方法 public static void JudgeType() { var list = new List<int>() { 1, 2 }; string type_ = list[0].GetType().Name; Console.WriteLine(type_); if (type_ == "Int32") { Console.WriteLine("Is the type of element in list int? {0}", "Yes"); } }
C#的五大数据类型
1.类(class):如Windows,Form,Console,String
2.结构体(Structures):如Int32,Int64,Single,Double
3.枚举(Enumerations):如HorizontalAlignment,Visibility
4.接口(Interfaces)
5.委托(Delegates)
C#类型的派生谱类
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
- 详解如何获取C#类中发生数据变化的属性信息
- 详解C# 泛型中的数据类型判定与转换
- 详解c# 可空类型(Nullable)
- 一文搞懂C# 数据类型
c# – Entity Framework为每种类型的记录选择最新记录
+-------+------------+-----------+----------+ |Id |DateTime |SensorId |Value | +-------+------------+-----------+----------+
SensorId是传感器详细信息表的外键.此值表中将有10m条记录.
我可以运行此sql命令返回每个SensorId的最新记录,并在大约0.3秒内运行.
SELECT a.* FROM Values as a INNER JOIN ( SELECT SensorId,MAX(ID) maxId FROM Values GROUP BY SensorId ) b ON a.SensorId = b.SensorId AND a.Id = b.maxId ORDER BY a.SensorId ASC
如何在保持(或改进)性能的同时在c#应用程序中使用实体框架实现相同的输出?
解决方法
dataContext.Values.GroupBy(p => p.SensorId) .Select(p => p.FirstOrDefault(w => w.Id == p.Max(m => m.Id))) .OrderBy(p => p.SensorId).ToList()
其中dataContext是ObjectContext类的实例. ToList()编译查询.
关于如何根据类型获取最新的每种类型的行并执行计算?和根据类名获取类的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于2021-03-22:小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有任意数量。1. 能装下 6 个苹果的袋子,2. 能装下 8 个苹、C # 数据类型获取、C sharp (#) 数据类型获取方式、c# – Entity Framework为每种类型的记录选择最新记录的相关信息,请在本站寻找。
本文标签: