Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
134 / 129 / 59
Регистрация: 16.06.2013
Сообщений: 523
1

Сложности с запросом

01.04.2018, 21:22. Показов 1437. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Помогите пожалуйста со сложным запросом. Хотелось бы все данные выгрузить одним запросом, но весь вечер кручу так и сяк - и не получается. Суть проблемы - есть таблица с данными. Грубо говоря (упрощённая версия):
SQL
1
2
3
4
5
6
7
                        CREATE TABLE dbo.table
                        ( 
                            name VARCHAR(20), 
                            TIMESTAMP INT, 
                            VALUE DECIMAL(25, 12), 
                            TYPE VARCHAR(6)
                        )
Мне нужно вытянуть значение value, для максимального и минимального timestamp, в указанном периоде (проще говоря - первое и последнее значения за период). Но, сделать это нужно сразу, для всех name. В ситуации, конда мне нужно было сумму и количество value запросить - всё было просто:
SQL
1
2
3
4
5
SELECT 
    name, TYPE,
    SUM(VALUE) AS valueSumm, 
    COUNT(*) AS ct
FROM dbo.table GROUP BY name, TYPE ORDER BY name
А, вот тут затык возник. Подскажите пожалуйста, куда копать.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2018, 21:22
Ответы с готовыми решениями:

Сложности с установкой SQLManagementStudio_x86_RUS
НЕ могу поставить, в картинке показано, чего не хватает... Я её вроде скачал, а что с этим фалом...

Сложности в понимании использования различных БД
Здравствуйте, мне необходима помощь. Я знаю только MySql и мне нужно написать почему я ее выбрал...

Группа профессионалов выполнит заказ любой сложности
Группа профессионалов выполнит заказ любой сложности, практически в любой среде разработки, как для...

Помощь с запросом
Привет всем! Очень нужна помощь, помогите, пожалуйста! Сервер SQL server 2008 r2. Есть 3 таблицы...

10
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
02.04.2018, 07:07 2
если нужно max и min то зачем период?
0
134 / 129 / 59
Регистрация: 16.06.2013
Сообщений: 523
02.04.2018, 07:55  [ТС] 3
qwertehok, значение Value, тех строк, у которых будет минимальный или максимальный timestamp, в указанном временном промежутке (первое и последнее значения).
MIN(timestamp) != начало временного промежутка (может быть на n секунд позже)
MAX(timestamp) != конец временного промежутка (может быть на n секунд раньше)
На данный момент, у меня только вот такое решение, в 2 запроса:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
DECLARE @maxPeriodTimestamp INT = 1522225760
DECLARE @minPeriodTimestamp INT = 1521534560
 
SELECT MAX(VALUE), name, TIMESTAMP FROM dbo.table AS tt WHERE 
TIMESTAMP = (SELECT MIN(TIMESTAMP) FROM dbo.table WHERE (name = tt.name) AND (TIMESTAMP <= @maxPeriodTimestamp) AND (TIMESTAMP > @minPeriodTimestamp)) 
GROUP BY name, TIMESTAMP
ORDER BY name
 
SELECT MAX(VALUE), name, TIMESTAMP FROM dbo.table AS tt WHERE 
TIMESTAMP = (SELECT MAX(TIMESTAMP) FROM dbo.table WHERE (name = tt.name) AND (TIMESTAMP <= @maxPeriodTimestamp) AND (TIMESTAMP > @minPeriodTimestamp)) 
GROUP BY name, TIMESTAMP
ORDER BY name
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
02.04.2018, 08:00 4
что то вы намудрили

SQL
1
2
3
SELECT * FROM dbo.table 
WHERE TIMESTAMP = 
(SELECT MAX(VALUE) FROM dbo.table AS tt WHERE TIMESTAMP BETWEEN @minPeriodTimestamp AND @maxPeriodTimestamp)
или я не так понял?
0
134 / 129 / 59
Регистрация: 16.06.2013
Сообщений: 523
02.04.2018, 08:16  [ТС] 5
qwertehok, походу я криво объясняю... Спать нужно явно больше >_<.
Смотри, у меня есть значения, грубо говоря:
Кликните здесь для просмотра всего текста

name: aaa, aaa, aaa, aaa, ааа
value: 0.123, 1.321, 3.156, 0.351, 0.65
timestamp: 0, 2, 5, 7, 8

Мне нужно, из промежутка, в котором значение timestamp от 1 до 10 (@maxPeriodTimestamp int = 10, @minPeriodTimestamp int = 1), выбрать 2 значения value - у которого минимальный timestamp, и то, у которого максимальный timestamp. Т.е. первое и последнее значения в промежутке. При этом, в примере у меня только 1 значение name, а мне нужно для всех name сделать.

Мой запрос:
SQL
1
2
3
4
SELECT MAX(VALUE), name, TIMESTAMP FROM dbo.table AS tt WHERE 
TIMESTAMP = (SELECT MIN(TIMESTAMP) FROM dbo.table WHERE (name = tt.name) AND (TIMESTAMP <= @maxPeriodTimestamp) AND (TIMESTAMP > @minPeriodTimestamp)) 
GROUP BY name, TIMESTAMP
ORDER BY name
Вытягивает MAX(VALUE) (значений value, за одну секунду может быть несколько, поэтому, чтобы получить только одно, я беру максимальное), для всех строк, у которых timestamp равен минимальному, для указанного имени, группируя выдачу, по именам. Т.е. в выдаче, для каждого имени будет value, с минимальным timestamp. Примерно так:
Кликните здесь для просмотра всего текста

max(value) |name |timestamp
----------------+---------------+---------
0.000000320000 |ааа |1521541819
0.000001060000 |ббб |1521534703
0.000000030000 |ввв |1521535179
0.000013510000 |ггг |1521553070
0.066000000000 |ддд |1521535554
3.946126530000 |еее |1521537855
0.000041980000 |жжж |1521569260
0.000000010000 |ззз |1521535340
0.000000400000 |иии |1521545751
0.000025580000 |ккк |1521539270
0.005661870000 |ллл |1521545990
0.000000810000 |ммм |1521538395
0.000000520000 |ннн |1521537498
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
02.04.2018, 08:34 6
прочитал задание несколько раз и все равно не понял зачем ты в подзапросе

SQL
1
2
3
4
SELECT MAX(VALUE), name, TIMESTAMP FROM dbo.table AS tt WHERE 
TIMESTAMP = (SELECT MIN(TIMESTAMP) FROM dbo.table WHERE (name = tt.name) AND (TIMESTAMP <= @maxPeriodTimestamp) AND (TIMESTAMP > @minPeriodTimestamp)) 
GROUP BY name, TIMESTAMP
ORDER BY name
выбираешь Min
TIMESTAMP = (SELECT MIN(TIMESTAMP)
и еще
у тебя для каждого Name свое значение min и max?

если нет, то почему бы не сократить размер выборки вынеся
(TIMESTAMP <= @maxPeriodTimestamp) AND (TIMESTAMP > @minPeriodTimestamp))
в основное условие?

SQL
1
2
3
4
SELECT MAX(TIMESTAMP), MIN(TIMESTAMP), name FROM 
(SELECT * FROM dbo.table WHERE TIMESTAMP <= @maxPeriodTimestamp AND TIMESTAMP > @minPeriodTimestamp)  AS tt 
GROUP BY name
ORDER BY name
0
134 / 129 / 59
Регистрация: 16.06.2013
Сообщений: 523
02.04.2018, 08:40  [ТС] 7
qwertehok, уфф... Мне не нужен MAX(TIMESTAMP) и MIN(TIMESTAMP). Так бы было всё просто. Мне нужны value, из строк с MAX(TIMESTAMP) и MIN(TIMESTAMP).
Блин, в прошлом посте пример написал, и не заюзал. Короче говоря, вот из такой 'таблички':
Кликните здесь для просмотра всего текста

name: aaa, aaa, aaa, aaa, ааа
value: 0.123, 1.321, 3.156, 0.351, 0.65
timestamp: 0, 2, 5, 7, 8

При (@maxPeriodTimestamp int = 10, @minPeriodTimestamp int = 1), нужно вытянуть 2 числа: 1,321 и 0,65.
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
02.04.2018, 08:44 8
я тебе вывел MAX(TIMESTAMP) и name
сделай join и выведи себе value

это сложно?
0
134 / 129 / 59
Регистрация: 16.06.2013
Сообщений: 523
02.04.2018, 08:51  [ТС] 9
qwertehok, угу. Сорри, вот на JOIN-ах, я и валился, когда пытался записать всё одним запросом. ВОт это:
SQL
1
2
3
4
SELECT MAX(TIMESTAMP), MIN(TIMESTAMP), name FROM 
(SELECT * FROM dbo.table WHERE TIMESTAMP <= @maxPeriodTimestamp AND TIMESTAMP > @minPeriodTimestamp)  AS tt 
GROUP BY name
ORDER BY name
Я и сам вывел быстро, а дальше - затуп дикий =(. Сорри, что так туплю - в последний раз запросы с JOIN писал больше пары лет назад, да и в целом плаваю в SQL, дальше основ, т.к. очень редко сталкиваюсь с ним. Обычно хватало гугла, по основным моментам, а щас что-то переклинило, и не идёт.
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
02.04.2018, 08:55 10
скинь кусок таблицы с данными
вложением в формате txt
0
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
02.04.2018, 10:18 11
Лучший ответ Сообщение было отмечено Захарка как решение

Решение

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
with t as
(
 select
  [name], [value], [timestamp], [type],
  row_number() over (partition by [name] order by [timestamp]) as rn1,
  row_number() over (partition by [name] order by [timestamp] desc) as rn2
 from
  MyTable
 where
  [timestamp] <= @maxPeriodTimestamp and [timestamp] > @minPeriodTimestamp
)
select
 [name], [value], [timestamp], [type]
from
 t
where
 rn1 = 1 or rn2 = 1;
1
02.04.2018, 10:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.04.2018, 10:18
Помогаю со студенческими работами здесь

Трудности с запросом
Добрый день, необходимо создать запрос по выборке данных, но, по какой то причине, результат...

Условие с запросом
Здравствуйте! Есть следующий запрос, который должен выполнить условие с запрсом: SELECT DISTINCT...

Сложность с запросом
На рисунке представлена схема структуры базы данных в виде ER модели, необходимо выполнить запрос...

запросом на выборку
добрый день ! есть таблица со столбцами : id/фио/дата и время. препдположим в таблице есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru