2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3  След.
 
 Re: Простые задачи по SQL.
Сообщение02.05.2018, 00:58 
Заслуженный участник


06/07/11
5536
кран.набрать.грамота
LazyFool1 в сообщении #1309191 писал(а):
3) Provide a list of the order types, ordered by the absolute difference ...
...
Ответ(?):
...
Я TSQL не знаю, и сказать ничего не могу.
Но знаю SQL, и могу сказать, что просто одним SQL-запросом эта задача решается в 5 строк и без создания дополнительной таблицы (и работать на указанных в задаче объемах будет быстрее во много раз). Не знаю, кто вам задал эти задачи и в каком виде ожидается ответ (может, в таком виде тоже сойдет), но я бы настоятельно рекомендовал решать задачу с помощью SQL (с SQL могу помочь, он не так сильно отличается в разных СУБД).
LazyFool1 в сообщении #1309191 писал(а):
Команда
Используется синтаксис SQL
SELECT CONCAT(‘The USER, CONVERT(VARCHAR, Users.id), ‘ ‘, name,
‘ made an ORDER, CONVERT(VARCHAR, Orders.id), ‘ at ’,
CONVERT(VARCHAR, created_at))
для пустой выборки отобразит что-то на экран?
Это не команда, а часть запроса, в таком виде выдаст ошибку. Что получится в результате правильно написанного запроса - зависит от самого запроса.

LazyFool1 в сообщении #1309191 писал(а):
Можно ли так писать:
Используется синтаксис SQL
SELECT Order_Type.id, name, abs_diff
FROM Order_Type, Order_type_with_abs_diff_AP_MP
WHERE Order_Type.id=Order_type_with_abs_diff_AP_MP.id
если в двух разных таблицах первые столбцы названы одинаково?
Не только можно, но и нужно. Если в двух таблицах есть столбцы с одинаковыми именами, без указания названия таблицы движок БД просто не будет знать, из какой таблицы брать столбец. Или, как вариант, написать "select *", чтобы выбрать все столбцы.

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение02.05.2018, 15:43 
Аватара пользователя


23/03/18
58
rockclimber, большое спасибо за ваше внимание к моим вопросам, буду вам очень обязан, если вы подскажете SQL запрос для третьей задачи и исправите отображение на экран результата запроса в комбинации команд
Используется синтаксис SQL

SELECT CONCAT(‘The USER, CONVERT(VARCHAR, Users.id), ‘ ‘, name,
‘ made an ORDER, CONVERT(VARCHAR, Orders.id), ‘ at ’,
CONVERT(VARCHAR, created_at))

 


Если не ошибаюсь, я нашёл обсуждение вопроса схожего с моим про SELECT CONCAT здесь, это как раз то, что мне нужно, не понимаю, в чём моя ошибка?

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение02.05.2018, 17:08 
Заслуженный участник


06/07/11
5536
кран.набрать.грамота
А вы, простите, вообще понимаете смысл ваших действий?
Если в разделе SELECT вы обращаетесь к полю id таблицы users и к полю id таблицы orders, то у вас как минимум должен быть раздел FROM, где вы перечисляете используемые таблицы, а так же условия связи таблиц - там же во FROM или в WHERE (а для третьей задачи понадобится еще GROUP BY и ORDER BY). Просто кусок селекта никакой смысловой нагрузки не несет. Причем это же простые базовые вещи - примерно как знание арифметических операций для решения уравнений.
Также непонятно, зачем вам конкатенация значений? В тексте задачи этого не требуется, а обычно достаточно просто вывести нужные столбцы (названия типов заказов в вашем случае).

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение05.05.2018, 22:44 


05/05/18

3
LazyFool1 в сообщении #1308675 писал(а):
Пока выложу только первую задачу.

You have 2 tables:

Users (
id primary key (int),
name (text)
)

Orders (
id primary key (int),
user_id foreign key to users (int),
created_at (timestamp)
)

Users can have zero or more orders. Most users have just a few orders, some have dozens or even hundreds. Many have zero orders.

1) Write an SQL query to return all users that have at least one order. Every user should come with 3 most recent orders (or fewer if this user has fewer than 3).

Ответ(?):

Таблицы

Users
id primary key (int) || name (text)


Orders
id primary key (int) || user_id foreign key to users (int) || created_at (timestamp)

Команды

код: [ скачать ] [ спрятать ]
Используется синтаксис Oracle 11 SQL
  1.  
  2. DECLARE min_user_id int;
  3.  
  4. SELECT min_user_id=MIN(id) FROM Users;
  5.  
  6. DECLARE max_user_id int;
  7.  
  8. SELECT max_user_id=MAX(id) FROM Users;
  9.  
  10. DECLARE i int;
  11.  
  12. SET i=min_user_id;
  13.  
  14.    WHILE i<=max_user_id DO
  15.  
  16.      SELECT Users.id, name, Orders.id, created_at
  17.  
  18.         FROM Users, Orders
  19.  
  20.         WHERE Users.id=Orders.user_id AND Orders.user_id=i
  21.  
  22.         ORDER BY created_at DESC
  23.  
  24.         LIMIT 3;
  25.  
  26.      SET i=i+1;
  27.  
  28.    END WHILE;
  29.  


Это правильно?


SELECT * FROM users u RIGHT JOIN orders o ON u.id = o.user_id; # выбрать всех пользователей у которых комментарии >= 1.
Написано навскидку. На всех SQL языках что-то в этом роде должно быть. Почитайте про JOIN они разные бывают и от этого зависит результирующая выборка, данная задача как раз для проверки ваших знаний этого оператора.

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение05.05.2018, 23:29 
Заслуженный участник


06/07/11
5536
кран.набрать.грамота
Bearil в сообщении #1310302 писал(а):
RIGHT JOIN
Кто будет подсказывать правильно, получит двойку, кто будет подсказывать неправильно, получит кол (с) Старая преподавательская мудрость :mrgreen:
Почему RIGHT JOIN? Нужно же вывести клиентов, у которых есть хотя бы один заказ. Тут нужен "обычный" (в смысле INNER JOIN), а RIGHT JOIN выведет вообще всех клиентов, и с заказами, и без.

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 00:34 


15/11/15
463
Сначала бы понять, как решить эту задачу внутри одной таблицы - orders, пока без привязки к users...

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 00:39 
Супермодератор
Аватара пользователя


09/05/12
17978
Кронштадт
 !  Bearil забанен за спам.

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 00:44 
Заслуженный участник


06/07/11
5536
кран.набрать.грамота
gevaraweb в сообщении #1310321 писал(а):
Сначала бы понять, как решить эту задачу внутри одной таблицы
Как-как... Оконными функциями проще всего (в Oracle это будет row_number(), аналоги в других СУБД не знаю, как называются), без оконных функций - LIMIT 3 в PostgreSQL/MySQL, TOP 3 в MS SQL, в Oracle до 12-й версии - rownum, начиная с 12-й появился аналог TOP(n). Привязка к users ничем не мешает.

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 00:50 


15/11/15
463
rockclimber в сообщении #1310326 писал(а):
без оконных функций - LIMIT 3 в PostgreSQL/MySQL,

вот это интересует... не так вроде тривиально. Нет, про LIMIT 3 понятно, непонятно - куда его сунуть. И хочется решение без JOIN , ведь до него люди жили раньше как-то.
rockclimber в сообщении #1310326 писал(а):
Привязка к users ничем не мешает.
мешает думать ))

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 01:19 
Заслуженный участник


06/07/11
5536
кран.набрать.грамота
gevaraweb в сообщении #1310327 писал(а):
И хочется решение без JOIN
Что значит без JOIN? Соединить таблицы без JOIN нельзя, а если выбрать 3 первые строки - JOIN для этого не нужен.
gevaraweb в сообщении #1310327 писал(а):
Нет, про LIMIT 3 понятно, непонятно - куда его сунуть.
Ой, кажется дошло. Отставить LIMIT, он тут не поможет :oops:
Я такие запросы для PostgreSQL последний раз писал 10 лет назад, я даже не уверен, что у меня вообще тогда была такая задача (а не другая). Берите оконные функции, они у всех есть и работают более-менее одинаково.

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 04:08 
Заслуженный участник


16/02/13
3472
Владивосток
rockclimber в сообщении #1310332 писал(а):
Соединить таблицы без JOIN нельзя
Без inner join — вполне, почему ж.
Используется синтаксис SQL
FROM t1 INNER JOIN t2 ON t1.f1 = t2.f2
— это ж в точности
Используется синтаксис SQL
FROM t1, t2 WHERE t1.f1 = t2.f2
Где-то, не вспомню, вообще читал, что современные оптимизаторы именно так inner join и раскрывают перед оптимизацией.
Вот что делать с медианой — ума не приложу. Начиная с вопроса, что есть медиана для дискретной величины и заканчивая — как её посчитать, ведь соответствующей агрегатной функции в SQL нет. Или в микрософте таки есть?

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 10:25 


07/08/14
3081
Медиана - считаем для каждого элемента сколько элементов больше него а сколько меньше. У того у которого эти два значения равны и есть медиана.

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 11:15 


15/11/15
463
rockclimber в сообщении #1310332 писал(а):
Берите оконные функции, они у всех есть
В актуальных (на хостингах) версиях mysql оконных функций нет, есть только в последней, 8 версии...

 Профиль  
                  
 
 Re: Простые задачи по SQL.
Сообщение06.05.2018, 11:18 
Заслуженный участник


16/02/13
3472
Владивосток
Ну, можно попробовать уложить это в многоэтажный SQL... Ужас неимоверный получится, но что ж поделать.

 Профиль  
                  
 
 Re: Простые задачи по SQL
Сообщение06.05.2018, 15:54 
Заслуженный участник


06/07/11
5536
кран.набрать.грамота
gevaraweb в сообщении #1310367 писал(а):
rockclimber в сообщении #1310332 писал(а):
Берите оконные функции, они у всех есть
В актуальных (на хостингах) версиях mysql оконных функций нет, есть только в последней, 8 версии...
Да, действительно.
Немного погуглив, обнаружил, что:
1) они появились только в прошлом году :shock: (я был уверен, что они там давно есть)
2) для решения задачи применялись способы типа приведенных ТСом в начале топика
3) код ТСа, возможно, написан для MySQL, а не для MS SQL

Тем не менее, если сейчас оконные функции уже есть, учебное задание лучше делать через них.
Если нужно без оконных функций - мне тут пришло в голову, что можно через коррелированный подзапрос в комбинации с LIMIT найти третий с конца заказ для каждого пользователя, а потом выбрать все последние заказы, начиная с найденного. 100% гарантии не дам, что сработает, но пока не вижу причин, почему может не получиться.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу Пред.  1, 2, 3  След.

Модераторы: Toucan, maxal, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group