powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / разростание результатов запроса.
14 сообщений из 14, страница 1 из 1
разростание результатов запроса.
    #32048302
pvnic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
поскажите, как правильно написать запрос. вот информация:
1) если использую такой код
Код: plaintext
1.
2.
3.
4.
5.
SELECT distinct (m.ticker), (m.stock) FROM tickers t, minutes m
WHERE ((DATEDIFF(day, m.startdate, '7/6/2002 10:04:00') <  1 ) AND 
    (m.ticker = t.alias) AND ((m.stop - m.start) <>  0 ) AND 
    (m.stock = 'mmvb') AND (t.chip =  1 ))


то у меня выбирается порядка 10 записей.
2) а если такой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT distinct (m.ticker), (m.stock), ((m.stop - m.start) / m.stop) 
    AS pers
FROM tickers t, minutes m
WHERE ((DATEDIFF(day, m.startdate, '7/6/2002 10:04:00') <  1 ) AND 
    (m.ticker = t.alias) AND ((m.stop - m.start) <>  0 ) AND 
    (m.stock = 'mmvb') AND (t.chip =  1 ))
GROUP BY m.ticker, m.stock, m.stop, m.start

то количество вырастает в сотни, хотя мне нужно, получить tikers упорядоченные согласно росту их цены. order by я даже еще не пишу....
...
Рейтинг: 0 / 0
разростание результатов запроса.
    #32048314
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй выполнить запрос без GROUP BY:
Код: plaintext
1.
2.
3.
4.
5.
SELECT distinct (m.ticker), (m.stock), ((m.stop - m.start) / m.stop) 
    AS pers
FROM tickers t, minutes m
WHERE ((DATEDIFF(day, m.startdate, '7/6/2002 10:04:00') <  1 ) AND 
    (m.ticker = t.alias) AND ((m.stop - m.start) <>  0 ) AND 
    (m.stock = 'mmvb') AND (t.chip =  1 ))


Сколько записей вернул?
...
Рейтинг: 0 / 0
разростание результатов запроса.
    #32048318
pvnic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1669
...
Рейтинг: 0 / 0
разростание результатов запроса.
    #32048319
pvnic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
те убирание не влияет.
я так понимаю, что это просиходит при расширении области действия дистинкта?
...
Рейтинг: 0 / 0
разростание результатов запроса.
    #32048325
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO то, что вы хотите получить это

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT m.ticker, m.stock, MAX(((m.stop - m.start) / m.stop))
    AS pers
FROM tickers t, minutes m
WHERE ((DATEDIFF(day, m.startdate, '7/6/2002 10:04:00') <  1 ) AND 
    (m.ticker = t.alias) AND ((m.stop - m.start) <>  0 ) AND 
    (m.stock = 'mmvb') AND (t.chip =  1 ))
GROUP BY m.ticker, m.stock


PS
или MIN(((m.stop - m.start) / m.stop)) или AVG(((m.stop - m.start) / m.stop)) или другая агрегатная функция
...
Рейтинг: 0 / 0
разростание результатов запроса.
    #32048326
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совершенно верно.
distinct (m.ticker), (m.stock) делает группировку по двум полям, а distinct (m.ticker), (m.stock), ((m.stop - m.start) / m.stop) по трём.
Так-что надо агрегат по третьему полю использовать и группировку по первым двум полям, тогда кол-во записей будет одинаковым.
...
Рейтинг: 0 / 0
разростание результатов запроса.
    #32048327
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, значит все верно. SELECT DISTINCT выбирает неповторяющиеся (уникальные) записи , делая проверку по всем реквизитам.

Первый запрос выбирает уникальную комбинацию 2х полей, второй - 5ти. Согласись - это не одно и тоже?

Так попробуй (только учти - могу ошибиться, т.к. навскидку пишу):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select t1.ticker, t1,stock, ((t2.stop - t2.start) / t2.stop) as pers
    from (
            SELECT distinct (m.ticker), (m.stock),(t.alias)
            FROM tickers t, minutes m
            WHERE ((DATEDIFF(day, m.startdate, '7/6/2002 10:04:00') <  1 ) AND 
           (m.ticker = t.alias) AND ((m.stop - m.start) <>  0 ) AND 
           (m.stock = 'mmvb') AND (t.chip =  1 )) 
           ) t1, minutes t2
    where t2.ticker = t1.alias
go


PS В качестве подзапроса взял твой с небольшой модернизацией. Но я бы попробовал упростить и оптимизировать.
...
Рейтинг: 0 / 0
разростание результатов запроса.
    #32048330
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, Glory меня обставил :0(.
Однако, сделал проще. Вот что значит - класс!
...
Рейтинг: 0 / 0
разростание результатов запроса.
    #32048331
pvnic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Glory - жили бы Вы в Новосибирске, поставил бы пива :)
а так просто спасибо.
...
Рейтинг: 0 / 0
разростание результатов запроса.
    #32048371
pvnic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тут такой косяк возникает:
Код: plaintext
1.
2.
3.
SELECT m.ticker as alias, min(((m.stop - m.start) / m.stop)) AS pers FROM
 tickers t, minutes m WHERE (DATEDIFF(day, m.startdate, '2002-08-28 15:24:00') <  1 ) 
and ((m.ticker = t.alias) AND ((m.stop - m.start) <>  0 ) and (m.stock='mmvb') AND (t.chip =  1 )) GROUP BY m.ticker

вот первые записи, которые он возвращает:
EESR -.1758241758241758241
Код: plaintext
1.
2.
SELECT m.ticker as alias, max(((m.stop - m.start) / m.stop)) AS pers FROM
 tickers t, minutes m WHERE (DATEDIFF(day, m.startdate, '2002-08-28 15:24:00') <  1 ) 
and ((m.ticker = t.alias) AND ((m.stop - m.start) <>  0 ) and (m.stock='mmvb') AND (t.chip =  1 )) GROUP BY m.ticker


вот первые записи, которые он возвращает:
EESR .1501000667111407605

те получается, что eesr является как лидером роста, так и лидером падения...
...
Рейтинг: 0 / 0
разростание результатов запроса.
    #32048378
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что - такое невозможно ? Или логически противоречит чему-то ?
В одной записи для EESR (m.stop - m.start) / m.stop = -0.1758241758241758241
а в другой = 0.1501000667111407605.

Запустите
Код: plaintext
1.
2.
SELECT m.ticker as alias, ((m.stop - m.start) / m.stop)) AS pers FROM
 tickers t, minutes m WHERE (DATEDIFF(day, m.startdate, '2002-08-28 15:24:00') <  1 ) 
and ((m.ticker = t.alias) AND ((m.stop - m.start) <>  0 ) and (m.stock='mmvb') AND (t.chip =  1 )) and m.ticker = 'EESR'


и прроверьте все возможные знаячения
...
Рейтинг: 0 / 0
разростание результатов запроса.
    #32048384
pvnic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
угу, возможно.
тогда я как можно сделать такое:
вместо старта и стопа, брать первое и последнее значение за день соотв?
...
Рейтинг: 0 / 0
разростание результатов запроса.
    #32048397
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неуверен, что до конца правильно понимаю вашу задачу.
Покажите стркутуру таблицы, кусочек данных и нужный вам конечный результат.
...
Рейтинг: 0 / 0
разростание результатов запроса.
    #32048411
pvnic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть 2 таблицы(под ними поля, из которых таблицы состоят)

-minutes
--ticker
--startdate
--start
--stop
-tickers
--alias
--chip
нужно получить список(уникальных)minutes.ticker, таким образом, чтобы они были отсортированны в порядке роста их цены за день.(те (stop-start)/stop)
в minutes валятся минутные значения...
да и дата еще для каждого тикердолжна браться последняя...
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / разростание результатов запроса.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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