Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как вывести негруппируемое поле?


Лёша ©   (2009-04-22 09:59:00) 

Есть таблица (лог состояний машин):
ID, -- //Key
Mach,
Date,
State,
Value, -- // bit состояние 1-вкл, 0-выкл
Description

Мне надо вывести все конечные сотояния(State) машин(Mach) на последнюю дату.
Такой запрос:
SELECT
 MAX([Date]) as [Date],
 MachID,  
 StateID
FROM
 MachineStateLog
GROUP BY
 MachID,
 StateID

выводит все состояния но без Value(включено оно или выключено) и без Description.

Как добавить в результаты Value, Description?


Sergey13   (2009-04-22 12:58:00) [1]

> [14] Лёша   (22.04.09 12:30)

Ну и не пиши. Я и не говорил, что отлаживал свой запрос на всех типах СУБД, о которой ты так и не сообщил пока.
Я давал направление для поиска решения.

Кстати то, что "она ничего не меняет. В выводимых данных." сомнительно. Вроде бы должна менять. Но воспроизводить у себя твою структуру и наполнять ее данными для экспериментов я не буду, сразу предупреждаю.


Лёша   (2009-04-22 12:30:00) [2]

Sergey13 ©   (22.04.09 11:51) [12]
Вообще-то, если m2 заменить на m1, строчку 'and m1.value=1' можно не писать, она ничего не меняет. В выводимых данных.


Плохиш   (2009-04-22 12:01:00) [3]


> Sergey13 ©   (22.04.09 11:51) [12]
> Ну блин а подумать то немного!

Зачем думать? Здесь же подают немощным и убогим...


Sergey13   (2009-04-22 11:51:00) [4]

> [11] Лёша   (22.04.09 11:13)

Ну блин а подумать то немного!
Мне что ли результат то нужен? Раз понял, что М2 в подзапросе, сложно попробовать М1 по смыслу подставить?

SELECT *
FROM
MachineStateLog M1
where [date]=(SELECT  MAX([Date]) FROM  MachineStateLog M2 where [M2.date]<:LastDate and M1.Mach=M2.Mach and m1.state=m2.state and m2.value=1)
and m1.value=1


Лёша   (2009-04-22 11:13:00) [5]


> SELECT *
> FROM
> MachineStateLog M1
> where [date]=(SELECT  MAX([Date]) FROM  MachineStateLog
> M2 where [M2.date]<:LastDate and M1.Mach=M2.Mach and m1.
> state=m2.state and m2.value=1)
> and m2.value=1

Такой не выполнится. m2 в подзапросе


Sergey13   (2009-04-22 11:07:00) [6]

> [9] Лёша   (22.04.09 11:04)

SELECT *
FROM
MachineStateLog M1
where [date]=(SELECT  MAX([Date]) FROM  MachineStateLog M2 where [M2.date]<:LastDate and M1.Mach=M2.Mach and m1.state=m2.state and m2.value=1)
and m2.value=1


Лёша   (2009-04-22 11:04:00) [7]

Sergey13 ©   (22.04.09 10:48) [6]
Выводит записи, в которых сотояния включались. А если сотояние на LastDate было выключено, его выводить не надо.


Лёша   (2009-04-22 10:55:00) [8]

12 ©   (22.04.09 10:41) [5]
Выводит по несколько раз одни и те же сотояния. И не смотрит включено оно или нет.


Лёша   (2009-04-22 10:54:00) [9]

Данные:
Дата            Машина  Сотояние        Включено  Описание
'01.01.2009'   123        'Ремонт'               1
'02.01.2009'   123        'Ремонт'               0
'05.01.2009'   123        'Ремонт'               1
'05.01.2009'   123        'Запуск'              1
'05.01.2009'   444        'Запуск'              1
'05.01.2009'   444        'Ремонт'              1
'06.01.2009'   333        'Резервация'        1
'06.01.2009'   444        'Запуск'              0
'07.01.2009'   123        'Перемещение'     1
'11.01.2009'   123        'Ремонт'               0

Вывод:
Дата            Машина  Сотояние        Включено  Описание
'05.01.2009'   123        'Запуск'            1
'07.01.2009'   123        'Перемещение'    1
'06.01.2009'   333        'Резервация'     1
'05.01.2009'   444        'Ремонт'           1


Sergey13   (2009-04-22 10:48:00) [10]

> [4] Лёша   (22.04.09 10:34)
> какое-то одно сотояние

Какой размытый критерий, не находишь?

> Одновременно сотояний у каждой машины может быть несколько.
Как это? Пример если можно. Мы ведь не знаем что там у тебя за состояния.

Вообще похоже, что ты даже словами не можешь четко сформулировать задачу прежде всего для себя.

Возможно подойдет так

SELECT *
FROM
MachineStateLog M1
where [date]=(SELECT  MAX([Date]) FROM  MachineStateLog M2 where [M2.date]<:LastDate and M1.Mach=M2.Mach and m1.state=m2.state and m2.value=1)


12   (2009-04-22 10:41:00) [11]

а так что получается

select
T1.Description, T2.*
from MachineStateLog as T1
join
(
SELECT
MAX([Date]) as D,
MachID as M,  
StateID as S
FROM
MachineStateLog
GROUP BY
MachID,
StateID
) as T2 on T1.MachID=T2.M


Лёша   (2009-04-22 10:34:00) [12]

Sergey13 ©   (22.04.09 10:19) [3]

Мне не надо вывести какое-то одно сотояние не последнюю дату.

Одновременно сотояний у каждой машины может быть несколько. Они должны отфильтроваться по условию Value = 1, и все отобразиться записями лога.


Sergey13   (2009-04-22 10:19:00) [13]

Сори, как то так

SELECT *
FROM
MachineStateLog M1
where [date]=(SELECT  MAX([Date]) FROM  MachineStateLog M2 where [M2.date]<:LastDate and M1.Mach=M2.Mach)


Sergey13   (2009-04-22 10:17:00) [14]

Тут по моему бе подзапросов не обойтись, если я правильно понял задачу.
Нужно нечто вроде

SELECT *
FROM
MachineStateLog
where [date]=(SELECT  MAX([Date]) FROM  MachineStateLog where [date]<:LastDate)

PS: Это плохая привычка обзывать поля зарезервированными словами.


12   (2009-04-22 10:16:00) [15]

как-то так можно (в рамках ыйд2000)

select
T1.command, T2.M, T2.W
from ow_LIFOWork as T1
join
(select
max(id) as M
,workend as W
from
ow_LIFOWork
Group by
id
,workend) as T2 on T1.id=T2.M


Наверх

Титульная страница Поиск, карта сайта Написать письмо