PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

SQL изберете елементи, където сумата на полето е по-малка от N

SELECT m.id, sum(m1.verbosity) AS total
FROM   messages m
JOIN   messages m1 ON m1.id <= m.id
WHERE  m.verbosity < 70    -- optional, to avoid pointless evaluation
GROUP  BY m.id
HAVING SUM(m1.verbosity) < 70
ORDER  BY total DESC
LIMIT  1;

Това предполага уникален, възходящ id както имате в примера си.

В съвременен Postgres - или по принцип смодерен стандартен SQL (но не в SQLite):

Прост CTE

WITH cte AS (
   SELECT *, sum(verbosity) OVER (ORDER BY id) AS total
   FROM   messages
   )
SELECT *
FROM   cte
WHERE  total <= 70
ORDER  BY id;

Рекурсивен CTE

Би трябвало да е по-бързо за големи маси, където извличате само малък комплект.

WITH RECURSIVE cte AS (
   (  -- parentheses required
   SELECT id, verbosity, verbosity AS total
   FROM   messages
   ORDER  BY id
   LIMIT  1
   )

   UNION ALL 
   SELECT c1.id, c1.verbosity, c.total + c1.verbosity 
   FROM   cte c
   JOIN   LATERAL (
      SELECT *
      FROM   messages
      WHERE  id > c.id
      ORDER  BY id
      LIMIT  1
      ) c1 ON  c1.verbosity <= 70 - c.total
   WHERE c.total <= 70
   )
SELECT *
FROM   cte
ORDER  BY id;

Всички стандартни функции, с изключение на LIMIT .

Строго погледнато, няма такова нещо като „независим от база данни“. Има различни SQL стандарти, но нито една RDBMS не отговаря напълно. LIMIT работи за PostgreSQL и SQLite (и някои други). Използвайте TOP 1 за SQL Server, rownum за Oracle. Ето изчерпателен списък в Wikipedia.

Стандартът SQL:2008 би бил:

...
FETCH  FIRST 1 ROWS ONLY

... който PostgreSQL поддържа - но едва ли има друга RDBMS.

Чистата алтернатива, която работи с повече системи, би била да я обвиете в подзаявка и

SELECT max(total) FROM <subquery>

Но това е бавно и тромаво.

SQL Fiddle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DATEADD еквивалент в PostgreSQL

  2. Извикването на съхранена функция или процедура няма да вмъкне и да запази промените

  3. Как мога да вмъкна JSON обект в Postgres с помощта на Java readyStatement?

  4. Как мога да получа psycopg2 регистриране на времето за изпълнение на заявка?

  5. PostgreSQL пул на връзки с PgBouncer