Здравствуйте, Буравчик, Вы писали:
Б>Здравствуйте, Bigger, Вы писали:
B>>Здравствуйте, syteser, Вы писали:
B>>СУБД какое, и так точно не получится. B>>Надо через GROUP BY
Б>Или использовать Б>
Б>ROW_NUMBER() OVER (PARTITION BY name ORDER BY mark) = 1
Б>
Спасибо. Это что-то очень серьезное у вас написано...
Здравствуйте, paucity, Вы писали:
P>Здравствуйте, syteser, Вы писали:
S>>Не удается добавит поле date...
P>Все поля указанные в select должны быть в group by
Здравствуйте, syteser, Вы писали:
S>SELECT name, MIN(ball) AS minball FROM mybase GROUP BY name ORDER BY minball DESC
S>Не удается добавит поле date...
Здравствуйте, 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
и количество записей становится как в исходной таблице.
Фамилии начинают повторяться
Здравствуйте, vsb, Вы писали:
vsb>Здравствуйте, syteser, Вы писали:
S>>SELECT name, MIN(ball) AS minball FROM mybase GROUP BY name ORDER BY minball DESC
S>>Не удается добавит поле date...
vsb>Тебе нужно использовать под-запрос.
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
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>
Спасибо за помощь! Серьезный код. Пытаюсь разобраться.
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
Здравствуйте, 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
Здравствуйте, Alex.Che, Вы писали:
AC>Здравствуйте, syteser, Вы писали:
S>>Query пишет — SQL error cod -104 с ссылкой на скобку после OVER
AC>никому не говори версию FB — пускай все угадывают.
Здравствуйте, 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>
Здравствуйте, syteser, Вы писали:
S>Помогите составить запрос который вернет набор данных с уникальным Именем, минимальным Балом и Датой когда получен этот Бал.
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, syteser, Вы писали:
S>>Помогите составить запрос который вернет набор данных с уникальным Именем, минимальным Балом и Датой когда получен этот Бал.
W>Таких дат может быть несколько, вообще-то.
согласен... Последней датой при которой был минимальный бал
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, syteser, Вы писали:
W>Тогда получается три этапа: W>1) получение минимального балла (простой group by) W>2) выбор нужной даты с этим баллом W>3) итоговый результат
W>Соответственно, три вложенных запроса.
Спасибо. Значит думаю в правильном направлении. Пока что каша в голове. Много чего прочел по SQL, жду пока уляжется
Здравствуйте, syteser, Вы писали:
S>Спасибо. Значит думаю в правильном направлении. Пока что каша в голове. Много чего прочел по SQL, жду пока уляжется
Про оконные функции (partition, over и т.п.) пока не читай, что бы не путаться, это следующий курс.
Здравствуйте, 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
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, syteser, Вы писали:
S>>Спасибо. Значит думаю в правильном направлении. Пока что каша в голове. Много чего прочел по SQL, жду пока уляжется
W>Про оконные функции (partition, over и т.п.) пока не читай, что бы не путаться, это следующий курс.
Я начал про OVER и понял что не понимаю абсолютно ничего
Здравствуйте, cppguard, Вы писали:
C>Здравствуйте, syteser, Вы писали:
C> for row in cursor.execute('SELECT name, max(date), score FROM students WHERE score < 4 GROUP BY name'):
Здравствуйте, Alex.Che, Вы писали:
AC>Здравствуйте, syteser, Вы писали:
AC>>>никому не говори версию FB — пускай все угадывают.
S>>Прошу прощения. FB 2.5
AC>в 2.5 оконные функции отсутствуют. AC>так что никаких over partition. AC>делай подзапросами.
В процессе разбирательсва и общения запрос опять поменялся ). Немного сам подумаю и отпишусь. Спасибо всем за помощь!
раз нет аналитических функций 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
Здравствуйте, 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
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>