powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Проверить SQL-запрос.
19 сообщений из 19, страница 1 из 1
Проверить SQL-запрос.
    #39452982
student_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть два готовых варианта 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, читаю книжку и делаю первую задачку. Помогите, пож-та.
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39453068
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Используйте тег SRC для обрамления кода, форматирование кода, и кнопку "Просмотр" для проверки результата.
2) По каждому запросу - указывайте логику, в него заложенную.
3) Для запроса с источником более чем одна таблица - у КАЖДОГО поля указывайте алиас таблицы.
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39453169
Что касается 2-го варианта, то уже не говоря о том, что в нем нет условия по дате, там заложена глобальная ошибка. Дело в том, что в связке Запрос139 LEFT JOIN Запрос140 результат будет содержать все варианты даты из Запрос139 и только те в Запрос140, которые есть в Запрос139. Т.е., если в 1-м есть дата 15.05.17, а во 2-м еще и 14.05.17, то этот результат выпадет.
Код: sql
1.
2.
3.
4.
5.
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;

К этому варианту есть вопросы:
1. Как, собственно называется ваша таблица, events.events или просто events, как во 2-м запросе?
2. Что такое DAY в DATEADD? По логике там должно быть 'd', да и в применении к дням достаточно простого вычитания, функция не нужна.
3. Запрос возвращает общее кол-во просмотров на обеих площадках. Вам так и нужно или, все же, по каждой отдельно (как во 2-м варианте)?
4. GETDATE() - это ваша функция? Какую дату она возвращает и почему нужно отнимать еще 2 дня?
5. "просмотры по дням", это за каждый день (как во 2-м варианте) или скопом?

Ответите - продолжим...
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39453304
student_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),
по второму варианту такие исправления

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
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39453305
student_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),

таблица events.events, но для упрощения временно стоит events
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39454913
student_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[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
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39454921
student_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Время – поле ts (в форматe 2016-01-01 10:15:11.525)

Нужно ли убирать 525 на конце?
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39455165
student_sqlпо второму варианту такие исправления

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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

Даже если результат правильный, ваше решение из разряда "не созданы мы для легких путей...". Дело в том, что запрос UNION (без ALL) отбрасывает дублирующие записи (а их может быть много), поэтому работает медленно.
Кроме того выходные поля выглядят так: Т1.ts_date, Т1.cnt, Т2.ts_date, Т2.cnt - что неудобно (особенно 2 столбца с датами)и не информативно.
Попробуйте такой вариант:
Код: sql
1.
2.
3.
SELECT DateValue(ts) AS ts_date, IIF(subsite_id=139,1,0) AS cnt139, IIF(subsite_id=140,1,0) AS cnt140 FROM events 
WHERE name='content_watch' AND subsite_id In (139,140) 
GROUP BY DateValue(ts)
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39457341
student_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев )student_sqlпо второму варианту такие исправления

[/src] Даже если результат правильный, ваше решение из разряда "не созданы мы для легких путей...". Дело в том, что запрос UNION (без ALL) отбрасывает дублирующие записи (а их может быть много), поэтому работает медленно.
Кроме того выходные поля выглядят так: Т1.ts_date, Т1.cnt, Т2.ts_date, Т2.cnt - что неудобно (особенно 2 столбца с датами)и не информативно.
Попробуйте такой вариант:
Код: sql
1.
2.
3.
SELECT DateValue(ts) AS ts_date, IIF(subsite_id=139,1,0) AS cnt139, IIF(subsite_id=140,1,0) AS cnt140 FROM events 
WHERE name='content_watch' AND subsite_id In (139,140) 
GROUP BY DateValue(ts)



Анатолий, большое спасибо!
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39457344
student_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий, теперь я пишу запрос по другому заданию. Посмотрите, пож-та, можно ли упростить логику?

Посчитать количество записей в таблице 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 -- категория контента: фильмы, сериалы, мультфильмы, программы
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39457380
student_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий, проверьте, пож-та, запрос по второму заданию


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;
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39457410
student_sqlПосчитать количество записей за последний месяц по отношению к текущей дате. Вот этого условия нет и из фразы не понятно, если сегодня 22.05.17, то надо с 23.04.17 или с 01.05.17.
И условие:
WHERE platform=’web’ OR platform=’mobile’
удобнее заменить на:
WHERE platform In (’web’,’mobile’)
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39457422
student_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев )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;
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39457445
student_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев )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;

Без ошибок?
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39457465
хм-м-м
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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;

Без ошибок?А запустить и проверить что мешает?
Ошибок как минимум три.
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39457476
student_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хм-м-м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;

Без ошибок?А запустить и проверить что мешает?
Ошибок как минимум три.

У меня пока нет таблицы для проверки
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39457480
student_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хм-м-м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;
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39457501
Если это запрос в Аксе, а не в SQLServer, то дата должна выглядеть так:#MM/DD/YYYY#
Также допускается применение функции, возвращающей значение типа Дата/Время.
SQLWHERE ([date] BETWEEN #04/22/2017# AND #05/22/2017#) AND platform In (‘web’, ‘mobile’)
Или более универсальное решение:
Код: sql
1.
WHERE ([date] BETWEEN DateAdd('m',-1,Date()) And Date()) AND platform In (‘web’, ‘mobile’)


Кстати, в вашем 1-м посте поле с датой называется "ts". Где правильно?
Кроме того, если в поле хранится и время, то все записи на 22.05.17 (кроме времени 00:00:00) будут исключены. Если они нужны, то в вашем случае вместо BETWEEN укажите:
[date] >= DateAdd('m',-1,Date())
...
Рейтинг: 0 / 0
Проверить SQL-запрос.
    #39457648
student_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев )Если это запрос в Аксе, а не в SQLServer, то дата должна выглядеть так:#MM/DD/YYYY#
Также допускается применение функции, возвращающей значение типа Дата/Время.
SQLWHERE ([date] BETWEEN #04/22/2017# AND #05/22/2017#) AND platform In (‘web’, ‘mobile’)
Или более универсальное решение:
Код: sql
1.
WHERE ([date] BETWEEN DateAdd('m',-1,Date()) And Date()) AND platform In (‘web’, ‘mobile’)


Кстати, в вашем 1-м посте поле с датой называется "ts". Где правильно?
Кроме того, если в поле хранится и время, то все записи на 22.05.17 (кроме времени 00:00:00) будут исключены. Если они нужны, то в вашем случае вместо BETWEEN укажите:
[date] >= DateAdd('m',-1,Date())

Анатолий, огромное спасибо. Разобралась с Вашей помощью!
Это было 2 разных задачки с разными таблицами и разными полями. Правильно date.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Проверить SQL-запрос.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]