当前位置: 首页 > 面试题库 >

SQL查找表中首次出现的数据集

马奇略
2023-03-14
问题内容

假设我有一张桌子:

CREATE TABLE T
(
    TableDTM  TIMESTAMP  NOT NULL,
    Code      INT        NOT NULL
);

我插入一些行:

INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 10:00:00', 5);
INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 10:10:00', 5);
INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 10:20:00', 5);
INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 10:30:00', 5);
INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 10:40:00', 0);
INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 10:50:00', 1);
INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 11:00:00', 1);
INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 11:10:00', 1);
INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 11:20:00', 0);
INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 11:30:00', 5);
INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 11:40:00', 5);
INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 11:50:00', 3);
INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 12:00:00', 3);
INSERT INTO T (TableDTM, Code) VALUES ('2011-01-13 12:10:00', 3);

因此,我最终得到了一个类似于以下内容的表:

2011-01-13 10:00:00, 5
2011-01-13 10:10:00, 5
2011-01-13 10:20:00, 5
2011-01-13 10:30:00, 5
2011-01-13 10:40:00, 0
2011-01-13 10:50:00, 1
2011-01-13 11:00:00, 1
2011-01-13 11:10:00, 1
2011-01-13 11:20:00, 0
2011-01-13 11:30:00, 5
2011-01-13 11:40:00, 5
2011-01-13 11:50:00, 3
2011-01-13 12:00:00, 3
2011-01-13 12:10:00, 3

我该如何选择每组相同数字的第一个日期,所以我得到了以下结果:

2011-01-13 10:00:00, 5
2011-01-13 10:40:00, 0
2011-01-13 10:50:00, 1
2011-01-13 11:20:00, 0
2011-01-13 11:30:00, 5
2011-01-13 11:50:00, 3

我整天大部分时间都在忙着子查询之类的事情,由于某种原因,我似乎无法破解它。我敢肯定某个地方有一个简单的方法!

我可能想从结果中排除0,但目前并不重要。


问题答案:

修订日期:2011年1月15日

我敢肯定某个地方有一个简单的方法!

就在这里。但是首先是两个问题。

  1. 该表不是关系数据库表。它没有唯一的密钥,这是RM和规范化所要求的(特别是每一行必须具有唯一的标识符;不一定是PK)。因此,用于在关系数据库表上操作的标准语言SQL无法对其执行基本操作。

    • 它是一个堆(数据结构,按时间顺序插入和删除),具有记录而不是行。
    • 使用SQL进行的任何和所有操作都将非常缓慢,并且将是不正确的
    • 将ROWCOUNT设置为1,执行行处理,SQL将在Heap上正常工作
    • 最好的选择是使用任何unix实用程序对其进行操作(awk,cut,chop)。他们快得令人眼花。乱。满足您的要求所需的awk脚本将花费3分钟来编写,并且将在几秒钟内运行数百万条记录(我上周写了几条)。

因此,真正的问题是 SQL在非关系堆中查找数据集的第一个匹配项

现在,如果您的问题是使用 SQL在关系表中查找数据的第一个出现
,那当然意味着有一些唯一的行标识符,这在(a)SQL中很容易,并且(b)在任何SQL风格中都是快速的。 。

* 除了甲骨文,甲骨文的[ **子查询处理能力很差**](https://stackoverflow.com/questions/4265213/how-to-turn-2-queries-with-common-columns-a-b-and-a-c-into-just-one-a-b/4279443#4279443) (特别是托尼·安德鲁斯(Tony Andrews)的评论,他是甲骨文的知名机构)。在这种情况下,请使用实体化视图。

  1. 这个问题很笼统(不抱怨)。但是,这些特定需求中的许多通常是在较大的上下文中应用的,并且该上下文具有此处的规范所没有的要求。通常,需要一个简单的子查询(但在Oracle中,请使用实例化视图来避免该子查询)。子查询也取决于外部上下文,即外部查询。因此,较小的一般性问题的答案将不包含针对实际特定需求的答案。

无论如何,我不想回避这个问题。为什么我们不使用真实的示例,而不是简单的通用示例?并
在关系表中找到另一组数据中一组数据的第一个或最后一次出现,或最小值或最大值

主要查询

让我们使用上一个问题中的“
ata模型

报告Alerts自某个日期以来的所有信息,以及持续时间的峰值,Acknowledged

由于您将为所有时间和历史记录需求使用完全相同的技术(具有不同的表名和列名),因此您需要完全了解子查询的基本结构及其不同的应用程序。

介绍

请注意,您不仅拥有带有关系标识符(复合键)的纯5NF数据库,而且还具有完整的时间能力,并且在不破坏5NF(无更新异常)的情况下呈现了时间要求,这意味着ValidToDateTime期间和持续时间为派生的,并且在数据中不重复。要点是,这使事情变得复杂,因此,这
不是Subqueries教程的最佳示例

  • 请记住,SQL引擎是一个集合处理器,因此我们以面向集合的思维方式来解决该问题。
    • 不要使引擎变得笨拙以进行行处理;那 很慢
    • 更重要的是, 不必要的
  • 子查询是普通的SQL。我使用的语法是直接的ISO / IEC / ANSI SQL。
    • 如果您无法在SQL中编写子查询代码,将会受到 很大的 限制;然后需要引入数据复制或使用较大的结果集物化视图或临时表或其他数据和附加处理的所有方式,这将是 缓慢的 ,以 非常慢的 ,何况 完全不必要
    • 如果在不切换到行处理或内联视图或临时表的情况下,您无法在真正的关系数据库中做任何事情(而我的数据模型始终如此),请寻求帮助,这就是您在这里所做的。
  • 在尝试理解第二个子查询之前,您需要完全理解第一个子查询(简单)。等等。

方法

首先,根据所需结果集的 结构
,使用最小联接等构建外部查询,仅此而已。首先解析外部查询的结构非常重要;否则,您将来回尝试使子查询适合外部查询,反之亦然。

  • 碰巧也需要一个子查询。因此,请暂时将其保留,稍后再取用。目前,外部查询会Alerts在特定日期后获取所有(未确认)


****



 类似资料:
  • 本文向大家介绍Python中首次出现真数,包括了Python中首次出现真数的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们需要在给定的数字列表中找到第一个出现的非零数字。 与枚举和下一个 我们起诉枚举以获取所有元素的列表,然后应用下一个函数以获取第一个非零元素。 示例 输出结果 运行上面的代码给我们以下结果- 与下一个和过滤器 将next和filter条件以及lambda表达式应用于条件不

  • 问题内容: 在SQL Server中,我试图计算自过去5天首次观察到与今天相同的天气(今天假设是2018年8月6日)以来的天数。每个镇。 数据如下: 这需要执行得很好,但到目前为止,我只想针对每个镇进行单个查询(并且将会有数十个镇,而不仅仅是四个镇)。这行得通,但不会扩展。 这是多伦多的那个… …正确返回4,因为今天有雨,而过去5天内第一次下雨是8月3日。 但是我想要返回的是一个像这样的表: 这怎

  • 问题内容: 假设我有一个包含以下值的表。 所以我想构造以下输出。 它仅获取列中每个元素的计数。 我在列出唯一列时遇到了问题。 谁能告诉我该怎么做? 我已经弄乱了和,但是无法获取左侧的值列表。 问题答案: 你是这个意思吗

  • 假设我有一个数组 查找出现次数最多的项的最有效和“pythonic”方法是什么?它在列表中出现了多少次?

  • 我们有一个列表: 每个条目是一个由两个字符串组成的字符串,由空格分隔。目标是找到出现次数最多的所有条目(即10.0和10.3,共出现2次)。 下面的代码有效。问题是,这3条语句是否可以减少到1条或至少2条?

  • 问题内容: 我有两个表:产品和订单。订单通过ProductID引用产品作为外键。我想知道每种产品已售出多少次,包括仅售出一次的产品。我几乎可以使用左联接来使其工作,但是对于所有产品,无论它们是否存在于orders表中,它仍然会为每一行提供一个计数为1的行。 有没有一种方法可以使您最终得到这样的结果? … 等等。 问题答案: 如果您只执行a ,那么您会将没有订单的产品计为1 … ,这将只计算具有非n