создать запрос SQL - PullRequest
       1

создать запрос SQL

0 голосов
/ 14 ноября 2011

У меня есть таблицы DeviceMaster и DeviceStatus.где в DeviceMaster - это главное устройство для устройств, а DeviceStatus - это состояние устройства. Теперь я хочу получить запись о последнем DeviceStatus каждого устройства, используя только одну строку, используя DeviceMasterId и в соответствии с последней первой (в порядке убывания).

например.

 DeviceName       RecordCreatedDate        Status
ElectronicRod     14/11/2011 12:00:00       On
ElectronicRod     14/11/2011 11:30:00       Off

, хотя в DeviceStatus имеется несколько записей.

здесь представлена ​​структура таблицы

DeviceMaster

[Id] [int],
[ROId] [int] ,
[ClientId] [int] ,
[DeviceTypeId] [int] ,
[Label] [varchar](50) ,
[ClientCommChannelId] [int] ,
[ServerCommChannelId] [bigint] ,
[DeviceName] [varchar](50) ,
[Address] [varchar](50) ,
[Attribute1] [varchar](50) ,
[Attribute2] [varchar](50) ,
[Attribute3] [varchar](50) ,
[IsDeleted] [bit] ,
[RecordCreatedDate] [datetime] ,
[RecordUpdatedDate] [datetime] ,
[RecordCreatedBy] [int] ,
[RecordUpdatedBy] [int] ,
[IsTransfered] [bit]

DeviceStatus

[Id] [bigint],
[ROId] [int],
[ClientId] [int],
[ServerDeviceId] [bigint] , --It is the foreign key reference of Device Id
[ClientDeviceId] [int] ,
[Status] [bit] ,
[TimeStamp] [datetime] ,
[Attribute1] [varchar](50) ,
[Attribute2] [varchar](50) ,
[Attribute3] [varchar](50) ,
[RecordCreatedDate] [datetime] ,
[RecordUpdatedDate] [datetime] ,
[RecordCreatedBy] [int] ,
[RecordUpdatedBy] [int] ,
[IsTransfered] [bit]

DeviceStatus имеет многострочную запись для одного устройства. Мне нужен последний DeviceStatus для каждого устройства.

Заранее спасибо

Ответы [ 5 ]

1 голос
/ 14 ноября 2011

Вы можете использовать CTE (Common Table Expression) с функцией ROW_NUMBER:

;WITH LastPerDevice AS
(
   SELECT 
       dm.DeviceName, ds.RecordCreatedDate, ds.Status,
       ROW_NUMBER() OVER(PARTITION BY dm.DeviceMasterId 
                         ORDER BY ds.RecordCreatedDate DESC) AS 'RowNum'
   FROM dbo.DeviceMaster dm
   INNER JOIN dbo.DeviceStatus ds ON ds.DeviceMasterId = dm.DeviceMasterId 
)
SELECT 
   DeviceName, RecordCreatedDate, Status
FROM LastPerDevice
WHERE RowNum = 1

Этот CTE "разбивает" ваши данные на DeviceMasterId, а для каждого раздела ROW_NUMBERфункция выдает последовательные числа, начиная с 1 и упорядочивая по RecordCreatedDate DESC - поэтому самая последняя строка получает RowNum = 1 (для каждого DeviceMasterId), что я и выбираю из CTE в инструкции SELECT после него.

0 голосов
/ 14 ноября 2011

Вы хотите получить статус из последней записи в таблице состояния для каждого устройства. Это означает, что вам нужно сделать два соединения с таблицей Status - одну таблицу, чтобы получить последнюю строку (группирование по устройству), а затем снова, чтобы получить статус для этого последнего статуса. Как это:

Я вижу, что у вас есть BIGINTS - это говорит о том, что таблица Status велика. Это говорит о том, что он обновляется очень часто. Убедитесь, что таблица состояния проиндексирована для ServerDeviceId.

select DeviceName ,ds.RecordCreatedDate,ds.Status
from 
DeviceMaster dm  inner join 
(select ServerDeviceId,MAX(Id) DeviceStatusId from DeviceStatus
group by ServerDeviceId) laststatus 
    on laststatus.ServerDeviceId= dm.Id inner join 
DeviceStatus ds 
    on ds.Id = laststatus.DeviceStatusId 
0 голосов
/ 14 ноября 2011

использовать max (), группировать по методу

Ваш код будет выглядеть примерно так:

 SELECT max("DeviceStatus") as "devicestatus" , "Id" FROM "DeviceMaster"
 group by "Id";

EDIT:

 SELECT max("RecordCreatedDate") as "Date" , "DeviceName" FROM "DeviceMaster"
 group by "Name";
0 голосов
/ 14 ноября 2011

Я не уверен, что вы ищете, но ниже используется подзапрос в предложении where для фильтрации по последней дате.Может быть, если это не совсем то, что вы ищете, это может помочь вам найти его.Дайте мне знать, если вам нужно, чтобы я что-то прояснил.

    select DeviceName, RecordCreateDated, Status
    from   DeviceMaster dm join
           DeviceStatus ds on dm.Id = ds.ServiceDeviceId
    where  DeviceName = 'ElectronicRod' and
           RecordCreateDate = 
               (select  max(RecordCreatedDate)
                from    DeviceMaster dm1 join 
                        DeviceStatus ds1 on dm1.Id = ds1.ServiceDeviceId
                where   dm1.DeviceName = dm.DeviceName)
0 голосов
/ 14 ноября 2011
select dm.DeviceName, ds1.LatestDate, ds2.Status
from DeviceMaster dm,
  (select ServerDeviceId, max(RecordCreatedDate) as LatestDate
  from DeviceStatus
  group by ServerDeviceId) ds1,
  DeviceStatus ds2
where dm.Id = ds1.ServerDeviceId
  and dm.Id = ds2.ServerDeviceId
  and ds1.LatestDate = ds2.RecordCreatedDate
order by ds1.LatestDate desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...