回答

收藏

SQL首次出现在搜索表中的数据集

技术问答 技术问答 272 人阅读 | 0 人回复 | 2023-09-14

假设我有一张桌子:; c  O# q/ ?1 Z. S! w
CREATE TABLE T(    TableDTM  TIMESTAMP  NOT NULL,   Code      INT        NOT NULL);我插入一些行:
; K6 W1 w! u5 K/ r; WINSERT INTO T (TableDTM,Code) VALUES ('2011-01-5);INSERT INTO T (TableDTM,Code) VALUES ('2011-01-5);INSERT INTO T (TableDTM,Code) VALUES ('2011-01-5);INSERT INTO T (TableDTM,Code) VALUES ('2011-01-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 1:00:00,1);INSERT INTO T (TableDTM,Code) VALUES ('2011-01-13 1:10:00,1);INSERT INTO T (TableDTM,Code) VALUES ('2011-01-13 1:20:00,0);INSERT INTO T (TableDTM,Code) VALUES ('2011-01-5);INSERT INTO T (TableDTM,Code) VALUES ('2011-01-5);INSERT INTO T (TableDTM,Code) VALUES ('2011-01-3);INSERT INTO T (TableDTM,Code) VALUES ('2011-01-13 12:00:00',3);INSERT INTO T (TableDTM,Code) VALUES ('2011-01-3);因此,我终于得到了一个类似以下内容的表:
# o5 h# b5 @4 Q% c% ]- [, S( l2011-01-13 10:00:00,52011-01-13 10:10:00,52011-01-13 10:20:00,52011-01-13 10:30:00,52011-01-13 10:40:00,02011-01-13 10:50:00,12011-01-13 11:00:00,12011-01-13 11:10:00,12011-01-13 11:20:00,02011-01-13 11:30:00,52011-01-13 11:40:00,52011-01-13 11:50:00,32011-01-13 12:00:00,32011-01-13 12:10:00,3我应该如何选择每组相同数字的第一个日期,得到了以下结果:) q, }  C4 a2 Y9 `1 R
2011-01-13 10:00:00,52011-01-13 10:40:00,02011-01-13 10:50:00,12011-01-13 11:20:00,02011-01-13 11:30:00,52011-01-13 11:50:00,3我整天大部分时间都在忙着查询和其他事情。出于某种原因,我似乎无法解决它。我相信某个地方有一个简单的方法!
& g5 _0 k2 R1 K% j9 ]3 p我可能想从结果中排除0,但目前并不重要。
# J' o0 p- k( l3 H, I5 t                                                               
& X, \; r6 b; G    解决方案:                                                               
7 K6 |# ?; Z3 `+ H; p; N9 _                                                                修订日期:2011年1月15日我相信某个地方有一个简单的方法!
) v4 L2 X+ ]4 e就在这里。但首先是两个问题。
0 n  R+ @$ }/ D1 g" `+ f, g[ol]该表不是关系数据库表。它没有唯一的密钥,这是RM以及标准化所要求的(特别是每行必须有独特的标识符);不一定是PK)。因此,在关系数据库表上操作的标准语言SQL基本操作不能执行。% v" q# h" i5 b$ D" `
它是一堆(数据结构,按时间顺序插入和删除),有记录而不是线。/ L: u  t& R/ w: q! U/ ]
使用SQL任何操作和所有操作都会非常缓慢和不正确- a' {+ ?( f5 F7 j+ b) l2 q
将ROWCOUNT设置为1,执行处理,SQL将在Heap上正常工作
  j4 d- J9 f. w0 u$ T# i最好的选择是使用任何东西unix实用程序操作它(awk,cut,chop)。他们快得让人眼花缭乱。混乱。满足您的要求awk编写脚本需要3分钟,数百万条记录将在几秒钟内运行(我上周写了几篇)。
+ _" r" d$ S5 I8 B7 s" A
[/ol]因此,真正的问题是 SQL在非关系堆中找到数据集的第一个匹配项    。% w1 f! T  y; D/ d( A: v
现在,如果你的问题是使用 SQL第一个出现在关系表中搜索数据3 `+ \2 N1 C1 e  m2 [! O
,当然,这意味着有一些独特的行标识符,这是(a)SQL很容易,而且(b)在任何SQL风格快。
: k0 T1 o  u/ z: J* 除了甲骨文,甲骨文的[ **子查询处理能力差**](https://stackoverflow.com/questions/4265213/how-to-turn-2-queries-with-common-columns-a-b-and-a-c-into-just-one-a-b/4279443#427943·安德鲁斯(Tony Andrews)评论,他是甲骨文的知名。在这种情况下,请使用物理视图。。) m2 w: G- K4 t9 V
[ol]这个问题很笼统(不抱怨)。然而,这些特定需求中的许多通常应用于较大的上下文,上下文具有这里的规范所没有的要求。通常需要一个简单的子查询(但在Oracle请使用实例视图以避免子查询)。子查询也取决于外部上下文,即外部查询。因此,较小的一般问题的答案将不包括针对实际特定需求的答案。[/ol]无论如何,我不想回避这个问题。为什么我们不使用真实的例子,而不是简单的一般例子?
3 _) i9 C4 m+ {% j2 ~7 k4 o在关系表中找到第一组或最后一组数据,或最小值或最大值    ?
$ {" |2 \; V" C6 R6 y6 V1 B" J主要查询* a! z: `6 m2 |1 o0 ?9 H) m: P$ q
让我们用上一个问题中的
) A. H4 x) C. L$ h& zata模型”
$ V4 F6 o% e  R- X6 j5 o
6 f6 N$ R/ Q" p报告Alerts自一定日期以来的所有信息,以及持续时间的峰值,Acknowledged8 @* K- p  ?1 I" r
由于您将在所有时间和历史记录中使用相同的技术(不同的表名和列名),您需要完全了解子查询的基本结构及其不同的应用程序。6 I- n6 w3 E7 ?( G7 R) U8 H- O
介绍请注意,您不仅拥有带有关系标识符(复合键)的纯5NF数据库,也有完整的时间能力,不破坏5NF时间要求(无异常更新),这意味着ValidToDateTime期间和持续时间是衍生的,在数据中不重复。关键是,这使事情变得复杂,所以,( F/ a. n8 ]6 K
不是Subqueries最佳教程示例    。& k" [+ t4 ?# ^4 L( d& C; n* X
请记住,SQL引擎是集合处理器,所以我们用集合思维来解决这个问题。
; T3 s5 M, F2 y/ x' N9 S/ a' Z不要让发动机笨拙地处理它; 很慢
. Q% @+ h' L1 J5 V4 C* j) A更重要的是,更重要的是,不必要的
2 J( E6 j) C! @' K7 W
子查询很常见SQL。我使用的语法是直接的ISO / IEC / ANSI SQL。
# ]/ h' R$ J8 u+ G假如你不能SQL中文作家查询代码,会受到 很大的    限制;然后引入数据复制或使用大型结果集物视图或临时表或其他数据和附加处理,这将是 缓慢的    ,以 非常慢的    ,何况 完全不必要
0 q4 q) ]$ ~- f- u如果您不能在真实的关系数据库中做任何事情,而不切换到行处理、内联视图或临时表(我的数据模型总是这样),请寻求帮助,这就是您在这里所做的。

! q  s3 y+ ^7 I& \6 |在试图理解第二个子查询之前,你需要完全理解第一个子查询(简单)等等。
方法首先,  是根据所需结果收集的结构
/ s! D+ o2 Z0 m, Q) ?,仅此而已。首先,分析外部查询的结构非常重要;否则,您将来会尝试使子查询适合外部查询,反之亦然。
) `8 z9 V: B/ x3 I) n" r3 T( ^% O  d碰巧也需要一个子查询。因此,请暂时保留,以后再使用。目前,外部查询会议Alerts在特定日期后获得所有(未确认)
  ]% A. r3 C8 t, R. l' y, p****
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则