如何选择数据但没有相似的时间?

时间:2019-03-29 08:49:24

标签: sql oracle

我有一个具有create_dt时间的表,我需要获取记录,但没有具有类似create_dt时间(15分钟)的数据。

因此,如果create_dt位于第一个记录的15分钟之内,那么我只需要获取一个记录而不是两个记录即可。

日期和时间的格式为'(29.03.2019 00:00:00','DD.MM.YYYY HH24:MI:SS')。谢谢

2 个答案:

答案 0 :(得分:1)

尚不清楚您到底想要什么,但是我能想到的一件事是将所有值四舍五入到最接近的“ 15分钟”,然后仅从“ 15分钟”间隔中选择一行:

import 'package:flutter/material.dart';

class ImageScreen extends StatefulWidget {
  final String url;
  ImageScreen(this.url);

  @override
  _MyImageScreen createState() => _MyImageScreen(url);
}

class _MyImageScreen extends State<ImageScreen> {
  final String url;
  _MyImageScreen(this.url);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('ImageScreen'),
        ),
        body: Image.network(url, width: double.infinity));
  }
}

表达式with rounded as ( select create_dt, date '0001-01-01' + (round((cast(create_dt as date) - date '0001-01-01') * 24 * 60 / 15) * 15 / 60 / 24) as rounded, ... other columns .... from your_table ), numbered as ( select create_dt, rounded, row_number() over (partition by rounded order by create_dt) as rn ... other columns .... from rounded ) select * from numbered where rn = 1; 将返回date '0001-01-01' + (round((cast(create_dt as date) - date '0001-01-01') * 24 * 60 / 15) * 15 / 60 / 24),四舍五入到下一个“ 15分钟”间隔。

然后create_dt为每个不同的15分钟间隔分配唯一的编号,然后最终选择总是选择该间隔的第一行。

在线示例:https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=e6c7ea651c26a6f07ccb961185652de7

答案 1 :(得分:0)

我将在概念上指导您。首先,这样做有一个您可能没有注意到的困难。

比方说,您想要同一小时或同一天的一项记录。但是,如果同一天创建了两个记录,则结果中只需要一个。哪一个?

之所以这样说,是因为对于SQL的设计者来说,没有一个答案可以提供给SQL选择。如果两个记录都不在表格输出中,则无法显示两个记录的数据。

这是一个普遍的问题,但是当SQL的设计者提供了一种处理它的功能时,它只有在对于两个记录如何具有一行结果的模棱两可的情况下才有效。该解决方案是GROUP BY,但是,如果所有与时间段匹配的记录都相同,则该字段仅用于显示除时间戳以外的其他字段。您必须在select子句中包括所有字段,并且如果您的时间段内的多个记录相同,则它们将在您的输出中创建多个记录。因此,尽管有解决此问题的工具GROUP BY,但是您可能无法使用它。

这是您想要的解决方案。如果多个记录靠在一起,则不要在第一个记录之后包括这些记录。因此,您需要一个WHERE子句,如果另一个记录最近继续处理它,它将排除该记录。因此,结果中每条记录的测试将涉及表中的 other 条记录。您需要将表加入本身

假设我们有一个名为error_events的表。如果我们在字段error_type中获得的相同值的倍数与其他类似事件的时间非常接近,则我们只希望看到第一个事件。 SQL将如下所示:

SELECT A.*
FROM error_events A
  INNER JOIN error_events B ON A.error_type = B.error_type
WHERE ???

您将必须弄清楚WHERE子句的详细信息,时间戳的功能将取决于您使用的RDBMS产品的时间。 (例如,mysql和postgres可能工作方式不同。)

您只需要没有早于15分钟的记录的记录。您确实想要原始记录。该记录将在联接中与之匹配,但它将是其时间戳记与前15分钟之间的时间段内唯一的记录。

因此,一个示例WHERE子句将是

WHERE B.create_dt BETWEEN [15 minutes before A.create_dt] and A.create_dt
GROUP BY A.*
HAVING 1 = COUNT(B.pkey)

就像我们说的那样,您将必须找出数据库乘积如何减去时间,以及这种差异如何表示15分钟。