|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
Есть два готовых варианта SQL-запроса для одной и той же задачи. Помогите разобраться, какой должен быть правильный SQL-запрос. Была задача: написать SQL-запрос к базе, чтобы посчитать просмотры по дням на двух площадках 139 и 140. Дана таблица с названиями событий и другими данными. Название основной таблицы – events.events Просмотр – событие content_watch в столбце name Площадка – subsite_id = 139 и 140 Время – поле ts (в форматe 2016-01-01 10:15:11.525) В основной таблице есть еще такие столбцы: id, user_id, site_id ПЕРВЫЙ ВАРИАНТ SELECT count(*) FROM events.events WHERE (subsite_id = 139 OR subsite_id = 140) AND name = content_watch AND ts >= DATEADD(DAY, -2, GETDATE()) GROUP BY subsite_id; ВТОРОЙ ВАРИАНТ SELECT T1.ts_date, T1.cnt AS 139, T2.cnt AS 140 FROM (SELECT DateValue(ts) AS ts_date, COUNT(*) AS cnt FROM events WHERE name='content_watch' AND subsite_id=139 GROUP BY DateValue(ts) ) AS T1 LEFT JOIN (SELECT DateValue(ts) AS ts_date, COUNT(*) AS cnt FROM events WHERE name='content_watch' AND subsite_id=140 GROUP BY DateValue(ts) ) AS T2 ON T1.ts_date = T2.ts_date Я только начала учить SQL, читаю книжку и делаю первую задачку. Помогите, пож-та. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2017, 11:13 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
1) Используйте тег SRC для обрамления кода, форматирование кода, и кнопку "Просмотр" для проверки результата. 2) По каждому запросу - указывайте логику, в него заложенную. 3) Для запроса с источником более чем одна таблица - у КАЖДОГО поля указывайте алиас таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2017, 13:07 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
Что касается 2-го варианта, то уже не говоря о том, что в нем нет условия по дате, там заложена глобальная ошибка. Дело в том, что в связке Запрос139 LEFT JOIN Запрос140 результат будет содержать все варианты даты из Запрос139 и только те в Запрос140, которые есть в Запрос139. Т.е., если в 1-м есть дата 15.05.17, а во 2-м еще и 14.05.17, то этот результат выпадет. Код: sql 1. 2. 3. 4. 5.
К этому варианту есть вопросы: 1. Как, собственно называется ваша таблица, events.events или просто events, как во 2-м запросе? 2. Что такое DAY в DATEADD? По логике там должно быть 'd', да и в применении к дням достаточно простого вычитания, функция не нужна. 3. Запрос возвращает общее кол-во просмотров на обеих площадках. Вам так и нужно или, все же, по каждой отдельно (как во 2-м варианте)? 4. GETDATE() - это ваша функция? Какую дату она возвращает и почему нужно отнимать еще 2 дня? 5. "просмотры по дням", это за каждый день (как во 2-м варианте) или скопом? Ответите - продолжим... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2017, 14:28 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
Анатолий ( Киев ), по второму варианту такие исправления SELECT * FROM (SELECT DateValue(ts) AS ts_date, COUNT(*) AS cnt FROM events WHERE name='content_watch' AND subsite_id=139 GROUP BY DateValue(ts)) AS T1 LEFT JOIN (SELECT DateValue(ts) AS ts_date, COUNT(*) AS cnt FROM events WHERE name='content_watch' AND subsite_id=140 GROUP BY DateValue(ts)) AS T2 ON T1.ts_date = T2.ts_date UNION SELECT * FROM (SELECT DateValue(ts) AS ts_date, COUNT(*) AS cnt FROM events WHERE name='content_watch' AND subsite_id=139 GROUP BY DateValue(ts)) AS T1 RIGHT JOIN (SELECT DateValue(ts) AS ts_date, COUNT(*) AS cnt FROM events WHERE name='content_watch' AND subsite_id=140 GROUP BY DateValue(ts)) AS T2 ON T1.ts_date = T2.ts_date ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2017, 16:57 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
Анатолий ( Киев ), таблица events.events, но для упрощения временно стоит events ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2017, 16:59 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
[quot Анатолий ( Киев )]Что касается 2-го варианта, то уже не говоря о том, что в нем нет условия по дате, там заложена глобальная ошибка. Дело в том, что в связке Запрос139 LEFT JOIN Запрос140 результат будет содержать все варианты даты из Запрос139 и только те в Запрос140, которые есть в Запрос139. Т.е., если в 1-м есть дата 15.05.17, а во 2-м еще и 14.05.17, то этот результат выпадет. [src] Анатолий, скажите, пож-та, теперь правильно? дублирую SELECT * FROM (SELECT DateValue(ts) AS ts_date, COUNT(*) AS cnt FROM events WHERE name='content_watch' AND subsite_id=139 GROUP BY DateValue(ts)) AS T1 LEFT JOIN (SELECT DateValue(ts) AS ts_date, COUNT(*) AS cnt FROM events WHERE name='content_watch' AND subsite_id=140 GROUP BY DateValue(ts)) AS T2 ON T1.ts_date = T2.ts_date UNION SELECT * FROM (SELECT DateValue(ts) AS ts_date, COUNT(*) AS cnt FROM events WHERE name='content_watch' AND subsite_id=139 GROUP BY DateValue(ts)) AS T1 RIGHT JOIN (SELECT DateValue(ts) AS ts_date, COUNT(*) AS cnt FROM events WHERE name='content_watch' AND subsite_id=140 GROUP BY DateValue(ts)) AS T2 ON T1.ts_date = T2.ts_date ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2017, 17:44 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
Время – поле ts (в форматe 2016-01-01 10:15:11.525) Нужно ли убирать 525 на конце? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2017, 17:51 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
student_sqlпо второму варианту такие исправления Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Даже если результат правильный, ваше решение из разряда "не созданы мы для легких путей...". Дело в том, что запрос UNION (без ALL) отбрасывает дублирующие записи (а их может быть много), поэтому работает медленно. Кроме того выходные поля выглядят так: Т1.ts_date, Т1.cnt, Т2.ts_date, Т2.cnt - что неудобно (особенно 2 столбца с датами)и не информативно. Попробуйте такой вариант: Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2017, 09:46 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
Анатолий ( Киев )student_sqlпо второму варианту такие исправления [/src] Даже если результат правильный, ваше решение из разряда "не созданы мы для легких путей...". Дело в том, что запрос UNION (без ALL) отбрасывает дублирующие записи (а их может быть много), поэтому работает медленно. Кроме того выходные поля выглядят так: Т1.ts_date, Т1.cnt, Т2.ts_date, Т2.cnt - что неудобно (особенно 2 столбца с датами)и не информативно. Попробуйте такой вариант: Код: sql 1. 2. 3.
Анатолий, большое спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2017, 14:00 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
Анатолий, теперь я пишу запрос по другому заданию. Посмотрите, пож-та, можно ли упростить логику? Посчитать количество записей в таблице info_watch в столбце user_id за последний месяц в отдельности по каждому id контента из столбца content_id и в отдельности для каждой платформы web и mobile из столбца platform. Посчитать количество записей за последний месяц по отношению к текущей дате. Вывести количество записей в новом столбце watch_month и сортировать content_id по убыванию количества записей за месяц. Для этого вывести новую таблицу из 3 столбцов: content_id, platform, watch_month. Где content_id это что показывали, platform это где показывали (тип платформы web, mobile), watch_month это сколько раз показывали конкретное id контента на конкретной платформе (web, mobile). информация о просмотрах info_watch content_id -- id контента platform date user_id category -- категория контента: фильмы, сериалы, мультфильмы, программы ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2017, 14:02 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
Анатолий, проверьте, пож-та, запрос по второму заданию SELECT Count (user_id) AS watch_month, content_id, platform FROM info_watch WHERE platform=’web’ OR platform=’mobile’ GROUP BY content_id, platform ORDER BY watch_month DESC; ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2017, 14:30 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
student_sqlПосчитать количество записей за последний месяц по отношению к текущей дате. Вот этого условия нет и из фразы не понятно, если сегодня 22.05.17, то надо с 23.04.17 или с 01.05.17. И условие: WHERE platform=’web’ OR platform=’mobile’ удобнее заменить на: WHERE platform In (’web’,’mobile’) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2017, 14:58 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
Анатолий ( Киев )student_sqlПосчитать количество записей за последний месяц по отношению к текущей дате. Вот этого условия нет и из фразы не понятно, если сегодня 22.05.17, то надо с 23.04.17 или с 01.05.17. И условие: WHERE platform=’web’ OR platform=’mobile’ удобнее заменить на: WHERE platform In (’web’,’mobile’) Анатолий, Вы правы, тогда так, посмотрите, пож-та, еще раз: SELECT Count (user_id) AS watch_month, content_id, platform FROM info_watch WHERE date BETWEEN ‘2017/04/22’ AND ’2017/05/22’ AND platform In (‘web’, ‘mobile’) GROUP BY content_id, platform ORDER BY watch_month DESC; ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2017, 15:11 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
Анатолий ( Киев )student_sqlПосчитать количество записей за последний месяц по отношению к текущей дате. Вот этого условия нет и из фразы не понятно, если сегодня 22.05.17, то надо с 23.04.17 или с 01.05.17. И условие: WHERE platform=’web’ OR platform=’mobile’ удобнее заменить на: WHERE platform In (’web’,’mobile’) Анатолий, так лучше? поменяла формат даты SELECT Count (user_id) AS watch_month, content_id, platform FROM info_watch WHERE date BETWEEN ‘2017-04-22’ AND ’2017-05-22’ AND platform In (‘web’, ‘mobile’) GROUP BY content_id, platform ORDER BY watch_month DESC; Без ошибок? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2017, 15:24 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
student_sqlSELECT Count (user_id) AS watch_month, content_id, platform FROM info_watch WHERE date BETWEEN ‘2017-04-22’ AND ’2017-05-22’ AND platform In (‘web’, ‘mobile’) GROUP BY content_id, platform ORDER BY watch_month DESC; Без ошибок?А запустить и проверить что мешает? Ошибок как минимум три. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2017, 15:32 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
хм-м-мstudent_sqlSELECT Count (user_id) AS watch_month, content_id, platform FROM info_watch WHERE date BETWEEN ‘2017-04-22’ AND ’2017-05-22’ AND platform In (‘web’, ‘mobile’) GROUP BY content_id, platform ORDER BY watch_month DESC; Без ошибок?А запустить и проверить что мешает? Ошибок как минимум три. У меня пока нет таблицы для проверки ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2017, 15:43 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
хм-м-мstudent_sqlSELECT Count (user_id) AS watch_month, content_id, platform FROM info_watch WHERE date BETWEEN ‘2017-04-22’ AND ’2017-05-22’ AND platform In (‘web’, ‘mobile’) GROUP BY content_id, platform ORDER BY watch_month DESC; Без ошибок?А запустить и проверить что мешает? Ошибок как минимум три. Добавила скобки в WHERE SELECT Count (user_id) AS watch_month, content_id, platform FROM info_watch WHERE (date BETWEEN ‘2017-04-22’ AND ’2017-05-22’) AND platform In (‘web’, ‘mobile’) GROUP BY content_id, platform ORDER BY watch_month DESC; ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2017, 15:45 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
Если это запрос в Аксе, а не в SQLServer, то дата должна выглядеть так:#MM/DD/YYYY# Также допускается применение функции, возвращающей значение типа Дата/Время. SQLWHERE ([date] BETWEEN #04/22/2017# AND #05/22/2017#) AND platform In (‘web’, ‘mobile’) Или более универсальное решение: Код: sql 1.
Кстати, в вашем 1-м посте поле с датой называется "ts". Где правильно? Кроме того, если в поле хранится и время, то все записи на 22.05.17 (кроме времени 00:00:00) будут исключены. Если они нужны, то в вашем случае вместо BETWEEN укажите: [date] >= DateAdd('m',-1,Date()) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2017, 16:01 |
|
Проверить SQL-запрос.
|
|||
---|---|---|---|
#18+
Анатолий ( Киев )Если это запрос в Аксе, а не в SQLServer, то дата должна выглядеть так:#MM/DD/YYYY# Также допускается применение функции, возвращающей значение типа Дата/Время. SQLWHERE ([date] BETWEEN #04/22/2017# AND #05/22/2017#) AND platform In (‘web’, ‘mobile’) Или более универсальное решение: Код: sql 1.
Кстати, в вашем 1-м посте поле с датой называется "ts". Где правильно? Кроме того, если в поле хранится и время, то все записи на 22.05.17 (кроме времени 00:00:00) будут исключены. Если они нужны, то в вашем случае вместо BETWEEN укажите: [date] >= DateAdd('m',-1,Date()) Анатолий, огромное спасибо. Разобралась с Вашей помощью! Это было 2 разных задачки с разными таблицами и разными полями. Правильно date. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2017, 18:52 |
|
|
start [/forum/topic.php?fid=45&fpage=75&tid=1612414]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 340ms |
total: | 468ms |
0 / 0 |