场景如下:
我有两个表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技术进阶群)
因为问题描述中没有提到数据模型,我假设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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。