Is there any equivalent to Postgresql EVERY aggregate function on other RDBMS?

人盡茶涼 提交于 2019-12-01 16:30:52

问题


Documentation for EVERY aggregate:

every(expression) : true if all input values are true, otherwise false

http://www.postgresql.org/docs/9.1/static/functions-aggregate.html


EVERY is semantically equivalent to COUNT(conditionIsTrue) = COUNT(*)

select person_id, 

    every(visited_site = 'http://stackoverflow.com') as visited_same_site_forever,

    count(case when visited_site = 'http://stackoverflow.com' then '^_^' end) 
    = count(*) as visited_same_site_forever2

from z
group by person_id
order by person_id

Output:

 person_id | visited_same_site_forever | visited_same_site_forever2 
-----------+---------------------------+----------------------------
        88 | f                         | f
     55327 | t                         | t
    256196 | f                         | f

Data source:

create table z(person_id int, visited_site varchar(100), datetime_visited timestamp);

insert into z values
(55327,'http://stackoverflow.com','Jan 1, 2010'),
(55327,'http://stackoverflow.com','Feb 14, 2012'),
(55327,'http://stackoverflow.com','May 1, 2012'),
(256196,'http://stackoverflow.com','February 1, 2012'),
(256196,'http://stackoverflow.com','February 2, 2012'),
(256196,'http://slashdot.org','May 2, 2012'),
(88,'http://theregister.co.uk','April 1, 2012'),
(88,'http://slashdot.org','April 2, 2012');

回答1:


Emulating EVERY() with CASE and SUM()

In fact, this article describes how EVERY() can be emulated via CASE and SUM(). The following two statements are equivalent:

SELECT EVERY(id < 10)
FROM book

SELECT CASE SUM(CASE WHEN id < 10 THEN 0 ELSE 1 END) 
         WHEN 0 THEN 1 
         ELSE 0 
       END
FROM book;

The same is true for the EVERY() window function:

SELECT 
  book.*, 
  EVERY(title LIKE '%a') OVER (PARTITION BY author_id)
FROM book

SELECT
  book.*,
  CASE SUM(CASE WHEN title LIKE '%a' THEN 0 ELSE 1 END)
       OVER(PARTITION BY author_id)
    WHEN 0 THEN 1 
    ELSE 0
  END
FROM book;

SQL Standard

The SQL:2008 standard mentions the EVERY aggregate function:

10.9 <aggregate function>

[...]

<aggregate function> ::=
  COUNT <left paren> <asterisk> <right paren> [ <filter clause> ]
  | <general set function> [ <filter clause> ]
  | <binary set function> [ <filter clause> ]
  | <ordered set function> [ <filter clause> ]

<general set function> ::=
  <set function type> <left paren> [ <set quantifier> ]
  <value expression> <right paren>

<set function type> ::=
  <computational operation>

<computational operation> ::=
  AVG
  | MAX
  | MIN
  | SUM
  | EVERY
  | [...]

But "advanced" SQL standard features are not often implemented by databases. Oracle 11g for instance, doesn't support it, neither does SQL Server 2012.

With HSQLDB, however, you may be more lucky. HSQLDB 2.x is very standards-compliant, also MySQL knows the BIT_AND() aggregate function, which is a non-standard alias to EVERY(), also supported by Postgres.

Note, some databases allow for writing user-defined aggregate functions, so you may as well implement EVERY() yourself.



来源:https://stackoverflow.com/questions/10407354/is-there-any-equivalent-to-postgresql-every-aggregate-function-on-other-rdbms

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!