Форум: "Прочее";
Текущий архив: 2008.08.10;
Скачать: [xml.tar.bz2];
ВнизПомогите составить SQL - запрос (выборка по последней дате) Найти похожие ветки
← →
Kostafey © (2008-06-24 13:43) [0]Имеется таблица (STRZAP) вида:
ind1 - идентификатор
PCH_NAME - назвние части
DAT - дата/время ввода
и ряд других полей
т.е.:
ind1 PCH_NAME DAT
------- ----------- ------------------- .....
11 ПЧ-1 24.06.2008 12:49:00 .....
6 ПЧ-1 24.06.2008 12:51:46 .....
12 ПЧ-2 24.06.2008 13:12:25 .....
13 ПЧ-2 24.06.2008 13:12:29 .....
Нужно получить набор данных в котором будут записи,
введенные каждой частью последними (в этот же день)
Для приведенного фрагмента:
ind1 PCH_NAME DAT
------- ----------- ------------------- .....
6 ПЧ-1 24.06.2008 12:51:46 .....
13 ПЧ-2 24.06.2008 13:12:29 .....
Так как же получить такой НД?SELECT PCH_NAME, max(DAT) as LastEntered
FROM STRZAP
WHERE
(
DAY(DAT)=DAY(GETDATE()) AND
MONTH(DAT)=MONTH(GETDATE()) AND
YEAR(DAT)=YEAR(GETDATE())
)
group by PCH_NAME
Этот код позволяет получить НД с полями времени
и названия части, а как полчить другие поля
соответсвующие этим записям?
← →
stas © (2008-06-24 13:46) [1]еще раз присоединить эту таблицу по дате и ID
← →
stas © (2008-06-24 13:49) [2]Ну или так (для MSSQL)
SELECT * FROM STRZAP
WHERE ind1= (select top 1 ind1 from STRZAP AS S
where S.PCH_NAME=STRZAP.PCH_NAME order by dat desc)
← →
Kostafey © (2008-06-24 13:50) [3]> еще раз присоединить эту таблицу по дате и ID
Так id в запросе
> SELECT PCH_NAME, max(DAT) as LastEntered
> FROM STRZAP
> WHERE
> (
> DAY(DAT)=DAY(GETDATE()) AND
> MONTH(DAT)=MONTH(GETDATE()) AND
> YEAR(DAT)=YEAR(GETDATE())
> )
> group by PCH_NAME
нет. Есть только название части и время.
← →
Kostafey © (2008-06-24 13:51) [4]> [2] stas © (24.06.08 13:49)
а...
Все, понял, спасибо!
← →
Sergey13 © (2008-06-24 14:10) [5]> [2] stas © (24.06.08 13:49)
Ни фига себе!
SELECT * FROM STRZAP
WHERE dat= (select max(dat) from STRZAP AS S
where S.PCH_NAME=STRZAP.PCH_NAME)
а если другие поля в выборке не нужны, то просто
select PCH_NAME,max(dat) from STRZAP AS S
group by 1
← →
stas © (2008-06-24 14:17) [6]SELECT * FROM STRZAP
WHERE dat= (select max(dat) from STRZAP AS S
where S.PCH_NAME=STRZAP.PCH_NAME)
Если даты одинаковые, то будет двоить и т.д.
← →
Павел Калугин © (2008-06-24 14:53) [7]
> stas © (24.06.08 14:17) [6]
цель этого запроса выбрать все за конкретную дату (в данном случае последнюю) . И что там будет "удвоено"?
← →
Johnmen © (2008-06-24 14:56) [8]
> stas © (24.06.08 14:17) [6]
> Если даты одинаковые, то будет двоить
И чему это противоречит?
> и т.д.
Что конкретно т.д.?
← →
stas © (2008-06-24 15:02) [9]Павел Калугин © (24.06.08 14:53) [7]
ну если так, то да.
Johnmen © (24.06.08 14:56) [8]
троить, четверить. :)
← →
stas © (2008-06-24 15:08) [10]Павел Калугин © (24.06.08 14:53) [7]
Дело в том что приведеный запрос возвращает именно по одной записи
на каждую PCH_NAME, исходя из этого и был написан мой запрос.
SELECT PCH_NAME, max(DAT) as LastEntered
FROM STRZAP
WHERE
(
DAY(DAT)=DAY(GETDATE()) AND
MONTH(DAT)=MONTH(GETDATE()) AND
YEAR(DAT)=YEAR(GETDATE())
)
group by PCH_NAME
← →
Johnmen © (2008-06-24 16:32) [11]
> stas © (24.06.08 15:02) [9]
> троить, четверить. :)
Так чему же это противоречит?
> Дело в том что приведеный запрос возвращает именно по одной записи
> на каждую PCH_NAME, исходя из этого и был написан мой запрос.
Твой запрос неверный даже в рамках формальной логики. Ибо "последних" записей м.б. больше одной.
← →
stas © (2008-06-24 16:38) [12]>Так чему же это противоречит?
не чему. Смотря что автору темы нужно.
← →
Johnmen © (2008-06-24 16:44) [13]
> не чему.
Если нИчему, то что значит [6]?
← →
stas © (2008-06-24 16:49) [14]Johnmen © (24.06.08 16:44) [13]
если быть точным [5].
[2] будет эффективным, при наличии дополнительных условий сортировки.
← →
Johnmen © (2008-06-24 17:11) [15]
> stas © (24.06.08 16:49) [14]
> если быть точным [5].
Я точен. Т.о. [6]
> [2] будет эффективным, ...
Что такое "эффективным"? Как это измерено? И по сравнению с чем?
← →
stas © (2008-06-24 17:19) [16]в [6] это я продублировал запрос из [5].
по сравнению с 6 или 5 - как удобнее.
Измерять ненужно.
← →
Johnmen © (2008-06-24 17:26) [17]
> в [6] это я продублировал запрос из [5].
Я спрашивал про слова, которые ты там написал. Если не доходит...
> Измерять ненужно.
Тебе было откровение?
Знаешь, у меня они тоже бывают. Так вот моё откровение говорит, что не будет.
← →
stas © (2008-06-24 17:26) [18]Просто немного усложним задачу, добавим еще поле dat2.
И нам нужно будет получить поля записи, которая соответсвует мимимальному dat2 при максимальном dat, на каждый PCH_NAME
(ого завернул)
В запросе [2] мы просто dat2 добавляем к условию сортировки.
А как быть с запросом [5] ?
(я конечно незнаю мож есть какие-то решения пока я считаю самым простым [2])
← →
Павел Калугин © (2008-06-24 17:32) [19]
> stas © (24.06.08 15:08) [10]
Данный запрос вернет последнюю запись по каждой части в текущую дату.
А теперь что делать если такое надо за каждый день строить? То есть следующий вопрос ожидаем
как посмотреть какую запись какая часть вводила последней за 3-й квартал минувшего года?
запрос в [6] модифицируется в два притопа три прихлопа.
Опять же, надо учитывать скорость поступления данных. Если данные поступают чаще чем раз в милисекунду то таки да, надо изобретать (точнее приписывать дистинкт). Но при таком количестве данных в день (скорость поступления данных сравнима с милисекундой), я думаю, тут раньше вопросы о "тормозах" появились бы.
← →
stas © (2008-06-24 17:32) [20]Johnmen © (24.06.08 17:26) [17]
>Надеюсь что твое откровение тебя не подведет...
← →
Павел Калугин © (2008-06-24 17:34) [21]опять же исхожу из того что "другие данные нужны" то есть не только часть и дата а например id последней записи
← →
stas © (2008-06-24 17:35) [22]Павел Калугин © (24.06.08 17:32) [19]
В чем сложность?
declare @dat datetime
set @dat=...
SELECT * FROM STRZAP
WHERE ind1= (select top 1 ind1 from STRZAP AS S
where S.PCH_NAME=STRZAP.PCH_NAME
AND dat<@DAT
order by dat desc)
← →
Павел Калугин © (2008-06-24 17:38) [23]хе.
1. речь про сложности с запросом в [10]
2. и получим последнюю запись в квартале а не за каждый день квартала.
← →
stas © (2008-06-24 17:46) [24]Павел Калугин © (24.06.08 17:38) [23]
Че-то непонял, ладно я ухожу с дома напишу.
А что в 10? это не мой запрос, это автора.
Вопрос не втом что прав кто-то или нет, хочется рассмотреть эту темы что же действительно правильно, я пока все же настаиваю на мной приведенном запросе.
← →
Павел Калугин © (2008-06-24 18:26) [25]в [6] приведен идеологически верный запрос
SELECT *
FROM STRZAP
WHERE dat= (select max(dat)
from STRZAP AS S
where S.PCH_NAME=STRZAP.PCH_NAME
)
то есть, получить все записи соответствующие условию.
Далее про "дублирование"
В каком темпе должны вводится данные что в одну милисекунду появится 2 записи? Сколько запсей будет в таблице через полгода?
← →
Anatoly Podgoretsky © (2008-06-24 20:00) [26]> Павел Калугин (24.06.2008 17:32:19) [19]
При такой скорости поступления данных вопрос врядли здесь появится, но конечно бывают исключения.
← →
Anatoly Podgoretsky © (2008-06-24 20:03) [27]
> В каком темпе должны вводится данные что в одну милисекунду
> появится 2 записи? Сколько запсей будет в таблице через
> полгода?
А почему в одну миллисекунду, разве СУБД была озвучена.
← →
stas © (2008-06-24 22:58) [28]Павел Калугин © (24.06.08 18:26) [25]
Элементарно - пакетная вставка, автоматизированная т.е. цикл либо прибор регистрации данных
Да я вобщем согласился ([14]) что в конкретном примере , будет достаточно [6]. В конце концов на поле с датой+PCH_NAME можно повесить уникальный индекс.
Хотя в самом начале я написал объеденить запрос с этой же таблицей т.е. [6]
Интересно что же на самом деле устроило автора.
и что по поводу - stas © (24.06.08 17:26) [18]?
← →
Kostafey © (2008-06-25 01:25) [29]> [6] stas © (24.06.08 14:17)
> SELECT * FROM STRZAP
> WHERE dat= (select max(dat) from STRZAP AS S
> where S.PCH_NAME=STRZAP.PCH_NAME)
>
> Если даты одинаковые, то будет двоить и т.д.
Согласен. Теоретически возможно.
Хотя практически нет. Т.к. сведения по каждой
части вносятся диспетчерами раз в сутки,
но в течение суток могут корректироваться,
отсюда и требование к тому что должна быть
последняя запись. Конечно 2 записи 1 диспетчер
за тысячную секунды не внесет, а вот запросом
на insert сделать это можно.
Поэтому
[2] stas © (24.06.08 13:49)
лучше.
> [11] Johnmen © (24.06.08 16:32)
>
> > stas © (24.06.08 15:02) [9]
> > троить, четверить. :)
>
> Так чему же это противоречит?
>
> > Дело в том что приведеный запрос возвращает именно по
> одной записи
> > на каждую PCH_NAME, исходя из этого и был написан мой
> запрос.
>
> Твой запрос неверный даже в рамках формальной логики. Ибо
> "последних" записей м.б. больше одной.
Если это произойдет... хотя практически врядли,
то в результирующем наборе данных будет одна запись
по каждой части, это приемлемо.
> [18] stas © (24.06.08 17:26)
Расширять зарос не планируется....
знаю, все вначале так же говорят :)
> [27] Anatoly Podgoretsky © (24.06.08 20:03)
> А почему в одну миллисекунду, разве СУБД была озвучена.
О, виноват. MS SQL Server 2000.
Да, и нужно не забывать, что, возможно,
диспетчер еще не вводил данные сегодня,
поэтому в итоге:SELECT * FROM STRZAP
WHERE ind1=
(
select top 1 ind1 from STRZAP AS S
where
(S.PCH_NAME=STRZAP.PCH_NAME)
and
(
DAY(DAT)=DAY(GETDATE()) AND
MONTH(DAT)=MONTH(GETDATE()) AND
YEAR(DAT)=YEAR(GETDATE())
)
order by dat desc
)
← →
Johnmen © (2008-06-25 10:00) [30]
> Если это произойдет... хотя практически врядли,
> то в результирующем наборе данных будет одна запись
И это неверно. Что я и пытался безуспешно втолковать кое-кому.
А уж если принять за аксиому "практически врядли", то запрос [6] правильнее во всех смыслах.
← →
Kostafey © (2008-06-25 10:22) [31]> А уж если принять за аксиому "практически врядли", то запрос
> [6] правильнее во всех смыслах.
Правильнее почему?
Система имеет не только пользователей, но
и администраторов, квалификация которых
варьируется в широком диапазоне :),
так что хотелось бы чтобы результат
запроса не шокировал (читай выдавал единственную
запись по каждой части) вне зависимости
от шаманства с БД.
← →
stas © (2008-06-25 10:45) [32]Johnmen © (25.06.08 10:00) [30]
и что по поводу - stas © (24.06.08 17:26) [18]?
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.08.10;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.007 c