Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.10;
Скачать: CL | DM;

Вниз

Помогите составить 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.018 c
15-1213437901
@!!ex
2008-06-14 14:05
2008.08.10
Дух времини(Zeitgeist)


3-1204041756
Reindeer Moss Eater
2008-02-26 19:02
2008.08.10
MSSQL 2005 и политика паролей домена


2-1215681982
Lamer666
2008-07-10 13:26
2008.08.10
Можно ли оттрасировать работу чужого DLL?


3-1203925161
Novochek
2008-02-25 10:39
2008.08.10
Не работает ХРАНИМАЯ ПРОЦЕДУРА


2-1215456380
Hmel15
2008-07-07 22:46
2008.08.10
Kak сохранять и загружать