Wie kann ich wählen Sie nur einen Datensatz pro „Person“, pro Tag mit einer inneren Verknüpfung in einer MS Access-Abfrage?

StackOverflow https://stackoverflow.com/questions/884393

Frage

Ich brauche um Daten aus zwei Tabellen: Neptune_FN_Analysis und Neptune_prem Es werden drei Felder readings_miu_id (vergleichbar mit einem Personennamen oder Artikelnummer), ReadDate, ReadTime (alle sind in Neptune_FN_Analysis) aufgerufen werden. Einige readings_miu_ids haben mehrere ReadTimes für mehrere Tage, aber ich will nur die „letzte Mal“ pro readings_miu_id eingegeben ziehen, pro Tag.
Ich brauche alle readings_miu_ids, die einen Eintrag Datum für den gewählten Bereich haben aber nur die letzte ReadTime für jeden Datensatz eingegeben ich ziehen.

Meine Lösung so weit, basierend auf einer Tabelle:

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);

Wenn ich versuche, diese Lösung anzupassen, kann ich die FROM [tableName] as A, INNER JOIN nicht tun, weil es mir einen Fehler gibt. Der ursprüngliche Code, die mein Vorgänger gemacht (das ist, was ich versuche / fix anzupassen) ist wie folgt:

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'
War es hilfreich?

Lösung

Ich verstehe nicht ganz alles, was Sie zu tun versuchen, aber wenn Sie auf einer Unterabfrage innere Verknüpfung, die die MAX aktuell bekommt, könnte es alle Datensätze zu beseitigen, wo das Datum nicht der max war

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# 

nach Bedarf ändern

Andere Tipps

Ich würde versuchen, so etwas wie folgt aus:

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
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>

Ich bin mir nicht sicher, was Sie durch die Angabe „INNER JOIN“ dieses Mal implizieren. Andere Antworten verwenden, um eine Unterabfrage, also hier ist ein ein Beispiel mit zwei INNER JOINs und keine Unterabfrage. Anstatt meinen Kopf um Ihr Schema bekommen :) Ich bin mit Northwind Kunden und das Datum ihrer letzten Bestellung zurückgeben:

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top