Выбрать все строки со значением MAX в SQLite? - PullRequest
1 голос
/ 22 июня 2019

Скажем, у меня есть таблица drafts, подобная следующей, где sent_for_review - логическое значение:

  rowid | title  |  author  | sent_for_review 
 -------|--------|----------|----------------- 
      1 | Draft1 | John Doe |               0 
      2 | Draft2 | John Doe |               0 
      3 | Draft3 | John Doe |               1 
      4 | Draft4 | John Doe |               1 

Я хочу выбрать все черновики, которые были отправлены на проверку.Если их нет, я хочу выбрать все черновики, которые не были отправлены на проверку.

Я попробовал следующее, чтобы попытаться сгруппировать по sent_for_review, а затем выбрать только самый высокий:

FROM drafts SELECT title WHERE author='John Doe'
GROUP BY sent_for_review HAVING MAX(sent_for_review)

Но это возвращает Draft3 только тогда, когда существуют Draft3 и Draft4 (он должен возвращать оба) ... и ничего не возвращает, когда существуют только Draft1 и Draft2 (он должен возвращать оба).

Как я могу заставить его вернуть все максимальные значения?

Ответы [ 3 ]

2 голосов
/ 22 июня 2019

Вы можете использовать оконные функции:

WITH cte AS (
  SELECT *, DENSE_RANK() OVER(PARTITION BY author ORDER BY sent_for_review DESC) dr
  FROM drafts
)
SELECT * 
FROM cte
WHERE dr = 1
  AND author='John Doe';

db-fiddle.com demo

1 голос
/ 22 июня 2019

При этом:

select * from drafts
where 
  author='John Doe' and
  sent_for_review = (select max(sent_for_review) from drafts where author='John Doe')

Этот запрос:

select max(sent_for_review) from drafts where author='John Doe'

вернет:1 если есть проекты, отправленные на рассмотрение и0 если нет

0 голосов
/ 23 июня 2019

Я полагаю, что это еще один способ получить ту же функциональность, что и ответ Лукаша (функционально более правильный, чем принятый ответ), но с более простым запросом.

create table drafts (title,author,sent_for_review);
insert into drafts values
  ('Draft1','Other Author',0),
  ('Draft2','Other Author',2),
  ('Draft1','John Doe',0),
  ('Draft2','John Doe',0),
  ('Draft3','John Doe',1),
  ('Draft4','John Doe',1);

select rowid,* from drafts a
  where sent_for_review = (select max(sent_for_review)
                            from drafts
                            where author = a.author
                            group by author)
    --and author='John Doe'   --uncomment as needed
    ;
...