Как я могу выбрать только одну запись на «человека» на дату с внутренним объединением в запросе MS Access? - PullRequest
0 голосов
/ 19 мая 2009

Мне нужно вытащить данные из двух таблиц: Neptune_FN_Analysis и Neptune_prem Будет 3 поля с именами readings_miu_id (сравнимо с именем человека или номером товара), ReadDate, ReadTime (все из которых находятся в Neptune_FN_Analysis). Некоторые readings_miu_id s имеют несколько ReadTime s в течение нескольких дней, но я хочу использовать только "последний раз", введенный для readings_miu_id, в день.
Мне нужны все readings_miu_id с датой входа для выбранного диапазона, но только последней ReadTime, введенной для каждой записи, которую я извлекаю.

Мое решение, основанное на одной таблице:

SELECT readings_miu_id, Reading, ReadDate, ReadTime, MIUwindow, SN, Noise, RSSI, OriginCol, ColID, Ownage
FROM analyzed AS A
WHERE ReadDate Between #4/21/2009# and #4/29/2009# 
AND ReadTime=
    (SELECT TOP 1 analyzed.ReadTime FROM analyzed 
    where analyzed.readings_miu_id = A.readings_miu_id 
    AND analyzed.ReadDate = A.ReadDate
    ORDER BY analyzed.ReadTime DESC);

Когда я пытаюсь адаптировать это решение, я не могу выполнить FROM [tableName] as A, INNER JOIN, потому что это дает мне ошибку. Исходный код, созданный моим предшественником (который я пытаюсь адаптировать / исправить), выглядит следующим образом:

SELECT readings_miu_id, Reading, ReadDate,Format([MIUtime],'hh:mm:ss') AS 
ReadTime, MIUwindow, SN, Noise, RSSI, ColRSSI, MIURSSI, Firmware, CFGDate, FreqCorr, 
Active, MeterType, OriginCol, ColID, Ownage, SiteID, PremID, Neptune_prem.prem_group1, 
Neptune_prem.prem_group2, ReadID 
INTO analyzed  
FROM Neptune_FN_Analysis INNER JOIN 
Neptune_prem ON Neptune_FN_Analysis.PremID = Neptune_prem.premice_id 
WHERE  SiteID = 36801 and ReadDate BETWEEN #04/21/09# AND #04/27/09#  
and OriginCol = 'US 29'    and ColID = 1 and ColID <> 0 and Active = 'Y'

Ответы [ 4 ]

2 голосов
/ 19 мая 2009

Я не совсем понимаю все, что вы пытаетесь сделать, но если вы внутренне присоединяетесь к подзапросу, который получает МАКС. Даты, он может удалить все записи, где дата не была максимальной

SELECT readings_miu_id, Reading, ReadDate, ReadTime, MIUwindow, SN, 
Noise, RSSI, OriginCol, ColID, Ownage 
FROM analyzed 
INNER JOIN 
(SELECT [whatever the id common to all like records is] as likeID, MAX(analyzed.ReadTime) as latestDate
 FROM analyzed 
 GROUP BY likeID) AS maxDate ON analyzed.likeID=maxDate.likeID AND analyzed.latestDate = maxDate.latestDate
WHERE ReadDate Between #4/21/2009# and #4/29/2009# 

изменить при необходимости

0 голосов
/ 20 мая 2009

Я не уверен, что вы подразумеваете, указав "INNER JOIN" на этот раз. Другие ответы используют подзапрос, так что вот пример, использующий два INNER JOIN с и без подзапроса. Вместо того, чтобы разбираться в вашей схеме :) Я использую Northwind для возврата клиентов и даты их последнего заказа:

SELECT C1.CustomerID, C1.CompanyName, 
       O1.OrderID, O1.OrderDate
  FROM (Customers AS C1
       INNER JOIN Orders AS O1
          ON C1.CustomerID = O1.CustomerID)
       INNER JOIN Orders AS O2
          ON C1.CustomerID = O2.CustomerID
 GROUP 
    BY C1.CustomerID, C1.CompanyName, 
       O1.OrderID, O1.OrderDate
HAVING O1.OrderDate = MAX(O2.OrderDate);
0 голосов
/ 20 мая 2009
SELECT
     <your columns>
FROM
     Neptune_FN_Analysis A1
INNER JOIN Neptune_prem ON
     P.premice_id = A1.PremID
LEFT OUTER JOIN Neptune_FN_Analysis A2 ON
     A2.readings_miu_id = A1.readings_miu_id AND
     A2.ReadDate = A1.ReadDate AND
     A2.ReadTime > A1.ReadTime
WHERE
     A2.readings_miu_id IS NULL AND
     <add any additional criteria here>
0 голосов
/ 19 мая 2009

Я бы попробовал что-то вроде этого:

SELECT a.readings_miu_id, a.Reading, a.ReadDate, a.ReadTime, a.MIUwindow, a.SN, a.Noise, a.RSSI, a.OriginCol, a.ColID, a.Ownage
FROM analyzed AS A INNER JOIN
          (SELECT max(ReadTime) as MaxReadTime,readings_miu_id FROM analyzed 
             WHERE ReadDate Between #4/21/2009# and #4/29/2009#
              GROUP BY readings_miu_id) as B 
             on a.readings_miu_id = b.readings_miu_id  and a.MaxReadTime = b.ReadTime
...