GVKun编程网logo

如何根据类型获取最新的每种类型的行并执行计算?(根据类名获取类)

19

针对如何根据类型获取最新的每种类型的行并执行计算?和根据类名获取类这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展2021-03-22:小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有

针对如何根据类型获取最新的每种类型的行并执行计算?根据类名获取类这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展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 个苹

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 # 数据类型获取

这里研究一下关于c#中如何获取变量类型的问题。

  1. 首先我们研究一下如何获取单个变量的类型
// 问题一:获取单个变量的类型
// 方法一:使用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");
    }
}
  1. 接下来我们研究一下如何获取列表变量的类型
// 问题二: 获取列表的类型
// 方法一:使用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 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为每种类型的记录选择最新记录

c# – Entity Framework为每种类型的记录选择最新记录

我有一个名为values的表,如下所示:

+-------+------------+-----------+----------+
|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#应用程序中使用实体框架实现相同的输出?

解决方法

使用LINQ to Entities和lambdas,您可以这样做:

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为每种类型的记录选择最新记录的相关信息,请在本站寻找。

本文标签:

上一篇如何计算不同时间段中数据库的行数?(数据库如何计算时间差)

下一篇计算包含字母/数字的行数(excel计算含有字母数量)