![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как вывести негруппируемое поле?
Лёша © (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