Wie kann ich wählen Sie nur einen Datensatz pro „Person“, pro Tag mit einer inneren Verknüpfung in einer MS Access-Abfrage?
-
22-08-2019 - |
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_id
s haben mehrere ReadTime
s für mehrere Tage, aber ich will nur die „letzte Mal“ pro readings_miu_id
eingegeben ziehen, pro Tag.
Ich brauche alle readings_miu_id
s, 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'
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 JOIN
s 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);