开发者社区> 问答> 正文

如何通过sql查询特定情况下的数据

场景如下:
我有两个表alarm记录告警的详细信息. alarm_date记录每天是否有该告警产生.

我需要查询大于2018-11-11日有多少种告警产生.

那么sql可以这样写:

select distinct on (alarm.id) alarm.id, alarm.description join alarm_date on alarm_date.aid = alarm.id where alarm_date.create_time > '2018-11-11' order by alarm.id;

如果我需要根据告警命中次数排序应该怎么写呢?

select distinct on (alarm.id) alarm.id, alarm.description, alarm.hits join alarm_date on alarm_date.aid = alarm.id where alarm_date.create_time > '2018-11-11' order by alarm.id , alarm.hits desc;

这样的排序是不正确的, alarm.hits desc并不影响排序结果。

因为用到了distinct on这个方法, 必须指定order by的第一个字段是alarm.id

考虑过在这个sql上再套一层查询:

select * from (select distinct on (alarm.id) alarm.id, alarm.description, alarm.hits join alarm_date on alarm_date.aid = alarm.id where alarm_date.create_time > '2018-11-11' order by alarm.id ) order by alarm.hits desc;

但是这样观察到有的数据丢失了, 很奇怪。 针对这个需求, 应该怎么做比较好, 求指教。
(整理来自PostgreSQL技术进阶群)

展开
收起
ImSoo 2018-11-20 09:39:48 2159 0
1 条回答
写回答
取消 提交回答
  • 阿里巴巴-淘宝-新制造-高级技术专家,PostgreSQL、Clojure、FreeBSD等技术爱好者

    因为问题描述中没有提到数据模型,我假设alarm表与alarm_date表的结构如下:

    create table alarm(
      id serial primary key,
      description text,
      hits int
    );
    comment on column alarm.hits is '告警的次数';
    
    create table alarm_date (
      id serial primary key,
      aid int references alarm,
      create_time timestamp
    );

    假设alarm与alarm_date是“one to many”的关系,则

    查询2018-11-11之后发生的告警,并按告警次数倒序的查询SQL如下:

    select
      id,
      description,
      hits
    from
      alarm
    inner join (
      select
       distinct
        aid
      from
        alarm_date
      where
        create_time > '2018-11-11'
    ) as records
    on
      alarm.id = records.aid
    order by
      hits desc
    2019-07-17 23:15:29
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载