Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.008 c
15-1214198395
Riply
2008-06-23 09:19
2008.08.10
C++ Builder разница между проетами


15-1213990535
wl
2008-06-20 23:35
2008.08.10
Аниме?


1-1196554693
Elec3C
2007-12-02 03:18
2008.08.10
Вопрос по HotKey ям


15-1214552185
Desdechado
2008-06-27 11:36
2008.08.10
Каталогизатор знаний


15-1214547294
Ega23
2008-06-27 10:14
2008.08.10
Мистика с Ctrl+Click какая-то...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский