минимальное значение уникальных данных
От: syteser  
Дата: 07.06.22 12:36
Оценка:
Добрый день.

Помогите со следующей задачей.

СУБД — FB 2,5

Есть таблица с полями Имя, Дата, Балл
Вида

Сидоров 22.05.2022 5
Иванов 01.01.2022 5
Петров 02.03.2022 3
Иванов 02.05.2022 2
Иванов 12.03.2022 5
Сидоров 03.04.2022 1

Помогите составить запрос который вернет набор данных с уникальным Именем, Балом и последней Датой когда Бал был меньше Х.
То есть, при Х = 4:

Петров 02.03.2022 3
Иванов 02.05.2022 2
Сидоров 03.04.2022 1
Отредактировано 08.06.2022 11:27 syteser . Предыдущая версия . Еще …
Отредактировано 08.06.2022 11:03 syteser . Предыдущая версия .
Re: минимальное значение уникальных данных
От: Alex.Che  
Дата: 07.06.22 12:53
Оценка:
Здравствуйте, syteser, Вы писали:

S>Помогите составить запрос


а как не получилось?
Re[2]: минимальное значение уникальных данных
От: syteser  
Дата: 07.06.22 12:56
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>Здравствуйте, syteser, Вы писали:


S>>Помогите составить запрос


AC>а как не получилось?


SELECT DISTINCT (name), date, MIN(ball) FROM mybase
Отредактировано 07.06.2022 12:58 syteser . Предыдущая версия .
Re[3]: минимальное значение уникальных данных
От: Bigger Российская Империя  
Дата: 07.06.22 14:06
Оценка: +1
Здравствуйте, syteser, Вы писали:

СУБД какое, и так точно не получится.
Надо через GROUP BY

Программист — это шаман..., подарите бубен!
Re[4]: минимальное значение уникальных данных
От: Буравчик Россия  
Дата: 07.06.22 14:57
Оценка:
Здравствуйте, Bigger, Вы писали:

B>Здравствуйте, syteser, Вы писали:


B>СУБД какое, и так точно не получится.

B>Надо через GROUP BY

Или использовать
ROW_NUMBER() OVER (PARTITION BY name ORDER BY mark) = 1
Best regards, Буравчик
Re[5]: минимальное значение уникальных данных
От: Alex.Che  
Дата: 07.06.22 15:19
Оценка:
Здравствуйте, Буравчик, Вы писали:

B>>Надо через GROUP BY


Б>Или использовать

Б>
Б>ROW_NUMBER() OVER (PARTITION BY name ORDER BY mark) = 1
Б>


сомневаюсь что препод оценит.
Re[4]: минимальное значение уникальных данных
От: syteser  
Дата: 07.06.22 15:45
Оценка:
Здравствуйте, Bigger, Вы писали:

B>Здравствуйте, syteser, Вы писали:


B>СУБД какое, и так точно не получится.

B>Надо через GROUP BY

Спасибо!
FB 2,5.
Я уже почти разобрался при помощи гугла.

SELECT name, MIN(ball) AS minball FROM mybase GROUP BY name ORDER BY minball DESC

Не удается добавит поле date...
Отредактировано 08.06.2022 11:03 syteser . Предыдущая версия . Еще …
Отредактировано 07.06.2022 15:48 syteser . Предыдущая версия .
Re[5]: минимальное значение уникальных данных
От: syteser  
Дата: 07.06.22 15:46
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Здравствуйте, Bigger, Вы писали:


B>>Здравствуйте, syteser, Вы писали:


B>>СУБД какое, и так точно не получится.

B>>Надо через GROUP BY

Б>Или использовать

Б>
Б>ROW_NUMBER() OVER (PARTITION BY name ORDER BY mark) = 1
Б>


Спасибо. Это что-то очень серьезное у вас написано...
Re[5]: минимальное значение уникальных данных
От: paucity  
Дата: 07.06.22 15:59
Оценка:
Здравствуйте, syteser, Вы писали:

S>Не удается добавит поле date...


Все поля указанные в select должны быть в group by
Re[6]: минимальное значение уникальных данных
От: syteser  
Дата: 07.06.22 16:14
Оценка:
Здравствуйте, paucity, Вы писали:

P>Здравствуйте, syteser, Вы писали:


S>>Не удается добавит поле date...


P>Все поля указанные в select должны быть в group by


Я вас понял, спасибо!
Re[5]: минимальное значение уникальных данных
От: Alex.Che  
Дата: 07.06.22 16:18
Оценка:
Здравствуйте, syteser, Вы писали:

B>>СУБД какое, и так точно не получится.

B>>Надо через GROUP BY

S>FB.



тут зависит от версии.
Re[5]: минимальное значение уникальных данных
От: vsb Казахстан  
Дата: 07.06.22 16:21
Оценка:
Здравствуйте, syteser, Вы писали:

S>SELECT name, MIN(ball) AS minball FROM mybase GROUP BY name ORDER BY minball DESC


S>Не удается добавит поле date...


Тебе нужно использовать под-запрос.
Re[6]: минимальное значение уникальных данных
От: syteser  
Дата: 07.06.22 16:27
Оценка:
Здравствуйте, paucity, Вы писали:

P>Здравствуйте, syteser, Вы писали:


S>>Не удается добавит поле date...


P>Все поля указанные в select должны быть в group by


делаю
SELECT name, MIN(ball) AS minball, date FROM mybase GROUP BY name, date ORDER BY minball DESC

и количество записей становится как в исходной таблице.
Фамилии начинают повторяться
Re[6]: минимальное значение уникальных данных
От: syteser  
Дата: 07.06.22 17:41
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, syteser, Вы писали:


S>>SELECT name, MIN(ball) AS minball FROM mybase GROUP BY name ORDER BY minball DESC


S>>Не удается добавит поле date...


vsb>Тебе нужно использовать под-запрос.


Я тоже так понял. Разбираюсь. Спасибо
Re[7]: минимальное значение уникальных данных
От: IZM  
Дата: 07.06.22 20:20
Оценка:
Oracle:
Select a.cName, Min(a.dDate) as dDate,a.nBall
from (select cName,  min(nBall) over (partition by cName) as MinBall, dDate, nBall from tb_test1) a
where a.minball=a.nball
group by a.cname,a.nball


При равных минимальных оценках берем минимальную дату

Еще проще:
select cName,  nBall, DDate 
from 
(select cName,  nBall, DDate, Row_number() over (partition by cName order by Cname ,Nball, Ddate) as NN from tb_test1) 
where NN=1
Отредактировано 07.06.2022 20:37 IZM . Предыдущая версия . Еще …
Отредактировано 07.06.2022 20:24 IZM . Предыдущая версия .
Re[8]: минимальное значение уникальных данных
От: syteser  
Дата: 08.06.22 03:18
Оценка:
Здравствуйте, IZM, Вы писали:

IZM>
IZM>select cName,  nBall, DDate 
IZM>from 
IZM>(select cName,  nBall, DDate, Row_number() over (partition by cName order by Cname ,Nball, Ddate) as NN from tb_test1) 
IZM>where NN=1
IZM>


Спасибо за помощь! Серьезный код. Пытаюсь разобраться.
Отредактировано 08.06.2022 3:45 syteser . Предыдущая версия .
Re[8]: минимальное значение уникальных данных
От: syteser  
Дата: 08.06.22 03:45
Оценка:
Здравствуйте, IZM, Вы писали:

IZM>
IZM>select cName,  nBall, DDate 
IZM>from 
IZM>(select cName,  nBall, DDate, Row_number() over (partition by cName order by Cname ,Nball, Ddate) as NN from tb_test1) 
IZM>where NN=1
IZM>


Query пишет — SQL error cod -104 с ссылкой на скобку после OVER
Отредактировано 08.06.2022 3:46 syteser . Предыдущая версия .
Re[9]: минимальное значение уникальных данных
От: Alex.Che  
Дата: 08.06.22 09:01
Оценка:
Здравствуйте, syteser, Вы писали:

S>Query пишет — SQL error cod -104 с ссылкой на скобку после OVER


никому не говори версию FB — пускай все угадывают.
Re[7]: минимальное значение уникальных данных
От: vsb Казахстан  
Дата: 08.06.22 09:33
Оценка:
Здравствуйте, syteser, Вы писали:

vsb>>Здравствуйте, syteser, Вы писали:


S>>>SELECT name, MIN(ball) AS minball FROM mybase GROUP BY name ORDER BY minball DESC


S>>>Не удается добавит поле date...


vsb>>Тебе нужно использовать под-запрос.


S>Я тоже так понял. Разбираюсь. Спасибо


Есть ещё не получилось, то примерно так будет максимально просто:

select b1.name,
       b1.ball,
       (select b2.date
        from mybase b2
        where b2.name = b1.name
          and b2.ball = b1.ball
        order by b2.date
        limit 1)
from (select name,
             min(ball) ball
      from mybase
      group by name
      order by name) b1
Re[10]: минимальное значение уникальных данных
От: syteser  
Дата: 08.06.22 11:02
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>Здравствуйте, syteser, Вы писали:


S>>Query пишет — SQL error cod -104 с ссылкой на скобку после OVER


AC>никому не говори версию FB — пускай все угадывают.


Прошу прощения. FB 2.5
Re[8]: минимальное значение уникальных данных
От: syteser  
Дата: 08.06.22 11:02
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, syteser, Вы писали:


vsb>>>Здравствуйте, syteser, Вы писали:


S>>>>SELECT name, MIN(ball) AS minball FROM mybase GROUP BY name ORDER BY minball DESC


S>>>>Не удается добавит поле date...


vsb>>>Тебе нужно использовать под-запрос.


S>>Я тоже так понял. Разбираюсь. Спасибо


vsb>Есть ещё не получилось, то примерно так будет максимально просто:


vsb>
vsb>select b1.name,
vsb>       b1.ball,
vsb>       (select b2.date
vsb>        from mybase b2
vsb>        where b2.name = b1.name
vsb>          and b2.ball = b1.ball
vsb>        order by b2.date
vsb>        limit 1)
vsb>from (select name,
vsb>             min(ball) ball
vsb>      from mybase
vsb>      group by name
vsb>      order by name) b1
vsb>


Спасибо. Буду пробовать!
Re: минимальное значение уникальных данных
От: wildwind Россия  
Дата: 08.06.22 11:17
Оценка:
Здравствуйте, syteser, Вы писали:

S>Помогите составить запрос который вернет набор данных с уникальным Именем, минимальным Балом и Датой когда получен этот Бал.


Таких дат может быть несколько, вообще-то.
Re[2]: минимальное значение уникальных данных
От: syteser  
Дата: 08.06.22 11:18
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, syteser, Вы писали:


S>>Помогите составить запрос который вернет набор данных с уникальным Именем, минимальным Балом и Датой когда получен этот Бал.


W>Таких дат может быть несколько, вообще-то.


согласен... Последней датой при которой был минимальный бал

Спасибо за поправку! Я сам уже запутался.

Последней датой, когда бал был ниже Х.
Отредактировано 08.06.2022 11:26 syteser . Предыдущая версия .
Re[3]: минимальное значение уникальных данных
От: wildwind Россия  
Дата: 08.06.22 11:30
Оценка:
Здравствуйте, syteser, Вы писали:

Тогда получается три этапа:
1) получение минимального балла (простой group by)
2) выбор нужной даты с этим баллом
3) итоговый результат

Соответственно, три вложенных запроса.
Re[4]: минимальное значение уникальных данных
От: syteser  
Дата: 08.06.22 11:43
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, syteser, Вы писали:


W>Тогда получается три этапа:

W>1) получение минимального балла (простой group by)
W>2) выбор нужной даты с этим баллом
W>3) итоговый результат

W>Соответственно, три вложенных запроса.


Спасибо. Значит думаю в правильном направлении. Пока что каша в голове. Много чего прочел по SQL, жду пока уляжется
Re[5]: минимальное значение уникальных данных
От: wildwind Россия  
Дата: 08.06.22 12:01
Оценка:
Здравствуйте, syteser, Вы писали:

S>Спасибо. Значит думаю в правильном направлении. Пока что каша в голове. Много чего прочел по SQL, жду пока уляжется


Про оконные функции (partition, over и т.п.) пока не читай, что бы не путаться, это следующий курс.
Re: минимальное значение уникальных данных
От: cppguard  
Дата: 08.06.22 12:30
Оценка:
Здравствуйте, syteser, Вы писали:

S>Добрый день.


S>Помогите со следующей задачей.


S>СУБД — FB 2,5


S>Есть таблица с полями Имя, Дата, Балл

S>Вида

S>Сидоров 22.05.2022 5

S>Иванов 01.01.2022 5
S>Петров 02.03.2022 3
S>Иванов 02.05.2022 2
S>Иванов 12.03.2022 5
S>Сидоров 03.04.2022 1

S>Помогите составить запрос который вернет набор данных с уникальным Именем, Балом и последней Датой когда Бал был меньше Х.

S>То есть, при Х = 4:

S>Петров 02.03.2022 3

S>Иванов 02.05.2022 2
S>Сидоров 03.04.2022 1

select name, max(date) where score < 5 group by name


from contextlib import closing
import sqlite3


with closing(sqlite3.connect(":memory:")) as connection:
    cursor = connection.cursor()
    cursor.execute('CREATE TABLE students (name text, date text, score integer)')
    cursor.execute("INSERT INTO students VALUES ('Sid', '2022-05-22', 5)")
    cursor.execute("INSERT INTO students VALUES ('Ivan', '2022-01-01', 5)")
    cursor.execute("INSERT INTO students VALUES ('Pete', '2022-03-02', 3)")
    cursor.execute("INSERT INTO students VALUES ('Ivan', '2022-05-02', 2)")
    cursor.execute("INSERT INTO students VALUES ('Ivan', '2022-03-12', 5)")
    cursor.execute("INSERT INTO students VALUES ('Sid', '2022-04-03', 1)")
    connection.commit()

    for row in cursor.execute('SELECT name, max(date), score FROM students WHERE score < 4 GROUP BY name'):
        print row


$ python test.py 
(u'Ivan', u'2022-05-02', 2)
(u'Pete', u'2022-03-02', 3)
(u'Sid', u'2022-04-03', 1)
Re[6]: минимальное значение уникальных данных
От: syteser  
Дата: 08.06.22 12:40
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, syteser, Вы писали:


S>>Спасибо. Значит думаю в правильном направлении. Пока что каша в голове. Много чего прочел по SQL, жду пока уляжется


W>Про оконные функции (partition, over и т.п.) пока не читай, что бы не путаться, это следующий курс.


Я начал про OVER и понял что не понимаю абсолютно ничего
Re[2]: минимальное значение уникальных данных
От: syteser  
Дата: 08.06.22 12:41
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Здравствуйте, syteser, Вы писали:


C> for row in cursor.execute('SELECT name, max(date), score FROM students WHERE score < 4 GROUP BY name'):


Спасибо. Буду пробовать!
Re[11]: минимальное значение уникальных данных
От: Alex.Che  
Дата: 08.06.22 14:46
Оценка:
Здравствуйте, syteser, Вы писали:

AC>>никому не говори версию FB — пускай все угадывают.


S>Прошу прощения. FB 2.5


в 2.5 оконные функции отсутствуют.
так что никаких over partition.
делай подзапросами.
Re[12]: минимальное значение уникальных данных
От: syteser  
Дата: 08.06.22 15:06
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>Здравствуйте, syteser, Вы писали:


AC>>>никому не говори версию FB — пускай все угадывают.


S>>Прошу прощения. FB 2.5


AC>в 2.5 оконные функции отсутствуют.

AC>так что никаких over partition.
AC>делай подзапросами.

В процессе разбирательсва и общения запрос опять поменялся ). Немного сам подумаю и отпишусь. Спасибо всем за помощь!
Re[9]: минимальное значение уникальных данных
От: IZM  
Дата: 09.06.22 03:12
Оценка:
раз нет аналитических функций c partition by то:
В первом запросе убираем аналитическую функцию:
select  a.CName, a.nMinball, min(b.ddate) as DMinDate
from
(select cName,  min(nBall) as nMinBall
   from tb_test1
 group by cName
) a
 join tb_test1 b on (b.cName=a.cname and b.nBall=a.nminball)
group by  a.CName, a.nMinball


если Select From select не сможет (хотя FB с версия 2 должен такое уметь), то можно внутренний Select заменить на View
Re[10]: минимальное значение уникальных данных
От: syteser  
Дата: 09.06.22 10:44
Оценка:
Здравствуйте, IZM, Вы писали:

IZM>раз нет аналитических функций c partition by то:

IZM>В первом запросе убираем аналитическую функцию:
IZM>
IZM>select  a.CName, a.nMinball, min(b.ddate) as DMinDate
IZM>from
IZM>(select cName,  min(nBall) as nMinBall
IZM>   from tb_test1
IZM> group by cName
IZM>) a
IZM> join tb_test1 b on (b.cName=a.cname and b.nBall=a.nminball)
IZM>group by  a.CName, a.nMinball
IZM>


IZM>если Select From select не сможет (хотя FB с версия 2 должен такое уметь), то можно внутренний Select заменить на View


Спасибо Вам!
Сейчас буду пробовать
Re[10]: минимальное значение уникальных данных
От: syteser  
Дата: 09.06.22 10:59
Оценка:
Здравствуйте, IZM, Вы писали:

IZM>
IZM>select  a.CName, a.nMinball, min(b.ddate) as DMinDate
IZM>from
IZM>(select cName,  min(nBall) as nMinBall
IZM>   from tb_test1
IZM> group by cName
IZM>) a
IZM> join tb_test1 b on (b.cName=a.cname and b.nBall=a.nminball)
IZM>group by  a.CName, a.nMinball
IZM>


Идеально! Вы — гений!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.