2017-08-16 30 views
1

以下是我的查詢結果。但是有很多冗餘記錄,因此,我想過濾掉這個查詢的結果。我的目標是每個角度只提取兩個記錄,第一個和最後一個。 例如,當角度爲, 我想要得到其第一個記錄時,日期= 2 /二千〇一十七分之二十七,時間= 2:00:00和 第二記錄的日期是2/27/2017和時間= 9:00:00 AM。 類似地,當角改變爲我想要得到其第一個記錄時,日期= 2 /二千〇一十七分之二十七時間= 10:00:00和其它記錄的日期和時間是2/27/2017和9:00:00 PM。 對於所有記錄也是類似的。 我試圖自己做,但它只返回一個記錄每個角度只有頂部一個,不知道如何得到最後一個。 我使用兩個查詢(查詢1)如何從訪問表中獲得有選擇性的記錄

SELECT final.Date, final.Angle 
FROM final 
GROUP BY final.Date, final.Angle 

和第二查詢(fileredOUtput)

SELECT Query1.Date, Query1.Angle, (SELECT TOP 1 final.Date FROM final WHERE Query1.Date=final.Date AND Query1.Angle= final.Angle) 
AS NewDate, 
(SELECT TOP 1 final.Angle FROM final WHERE Query1.Date=final.Date AND Query1.Angle= final.Angle) AS NewAngle, 
(SELECT TOP 1 final.earthCol.Value FROM final WHERE Query1.Date=final.Date AND Query1.Angle= final.Angle) AS NewE_CV, 
(SELECT TOP 1 final.earthCol.ColNu FROM final WHERE Query1.Date=final.Date AND Query1.Angle= final.Angle) AS New_E_CN, 
(SELECT TOP 1 final.mars_Col.Value FROM final WHERE Query1.Date=final.Date AND Query1.Angle= final.Angle) AS NewM_CV, 
(SELECT TOP 1 final.Col_apart FROM final WHERE Query1.Date=final.Date AND Query1.Angle= final.Angle) AS New_CApart, 
(SELECT TOP 1 final.mars_Col.ColNu FROM final WHERE Query1.Date=final.Date AND Query1.Angle= final.Angle) AS NewM_CN, 
(SELECT TOP 1 final.Time FROM final WHERE Query1.Date=final.Date AND Query1.Angle= final.Angle) AS NewTime 
FROM Query1, final 
WHERE (((Query1.Date) Between [Forms]![Query Form]![txtStartDate] And [Forms]![Query Form]![txtEndDate])); 

Query results and results I need are marked with red這樣做。 期待收到你的來信。 謝謝。

+0

爲什麼GROUP BY在不涉及聚合函數時。你想做SELECT DISTINCT嗎? – jarlh

+0

是的,我想選擇distint記錄,但只有兩個角度,並非全部 – Ayaz49

+0

請看看我發佈的圖片 – Ayaz49

回答

0

試試這個

SELECT * FROM final INNER JOIN 
(SELECT Min(DDate + DTime) AS DDateTime, Angle FROM final GROUP BY Angle 
UNION SELECT Max(DDate + DTime) AS DDateTime, Angle FROM final GROUP BY Angle) mm 
ON final.DDate + final.DTime = mm.DDateTime AND final.Angle = mm.Angle 

請注意,在測試中我分別改變了前兩列DDate和DTIME的名字,因爲日期和時間是保留字。

EDIT

這使得它相當困難,尤其是在訪問不具有超前/滯後功能。以下應該可以工作,但有人可能會有更優雅的解決方案!

SELECT final.* FROM final INNER JOIN 
(SELECT MIN(DDateTime) AS MDateTime, Angle FROM 
(SELECT (f.DDate+ f.DTime) AS DDateTime, f.Earth_Value, f.Mars_Value, f.Earth_Col, f.Mars_Col, f.Diff, f.Angle, f.Col_Apart, 
IIF(ISNULL((SELECT MIN(m.DDate + m.DTime) FROM final m where f.angle <> m.angle and (f.DDate+f.DTime) < (m.DDate+m.DTime))), 
(SELECT MAX(DDate+DTime) FROM final),(SELECT MIN(m.DDate + m.DTime) FROM final m where f.angle <> m.angle and (f.DDate+f.DTime) < (m.DDate+m.DTime))) AS NextChangeDateTime 
FROM final f order by DDate, DTime) g 
GROUP BY g.Angle,g.NextChangeDateTime 
UNION 
SELECT MAX(DDateTime) AS MDateTime, Angle FROM 
(SELECT (f.DDate+ f.DTime) AS DDateTime, f.Earth_Value, f.Mars_Value, f.Earth_Col, f.Mars_Col, f.Diff, f.Angle, f.Col_Apart, 
IIF(ISNULL((SELECT MIN(m.DDate + m.DTime) FROM final m where f.angle <> m.angle and (f.DDate+f.DTime) < (m.DDate+m.DTime))), 
(SELECT MAX(DDate+DTime) FROM final),(SELECT MIN(m.DDate + m.DTime) FROM final m where f.angle <> m.angle and (f.DDate+f.DTime) < (m.DDate+m.DTime))) AS NextChangeDateTime 
FROM final f order by DDate, DTime) g 
GROUP BY g.Angle,g.NextChangeDateTime) FLDates 
ON final.DDate + final.DTime = FLDates.MDateTime 

編輯2

技術上有沒有這樣的東西在MS Access臨時表。真的,你只需創建一個普通表並刪除它的內容,每次你想使用它。

要創建你需要這個複製到一個查詢窗口(SQL視圖)的表,然後單擊運行:

CREATE TABLE final (
    DDate  DATETIME  NOT NULL, 
    DTime  DATETIME  NOT NULL, 
    Earth_Value   DOUBLE NOT NULL, 
    Mars_Value   DOUBLE NOT NULL, 
    Earth_Col   INTEGER  NOT NULL, 
    Mars_Col   INTEGER  NOT NULL, 
    Diff   INTEGER  NOT NULL); 

然後您現有的查詢類型之前,(你只需要第一行):

INSERT into final 
SELECT etc. 

現在您將可以按原樣運行查詢了。

+0

先生,它只爲整個文件提供每個角度的兩條記錄,但是我的目標是每個角度提取兩條記錄,以便它們在一起的時間。例如(1)90(2)90(3)90(4)10(5)100(6)90(7)90(8)90現在我想要得到(1)(3)(4) )(6)和(8)條記錄。兩個連續的角度記錄。 – Ayaz49

+0

看我的編輯。我已經改變爲每批第一次和最後一次。 –

+0

@ Ayaz49我還沒有聽到。你現在修好了嗎?如果是這樣,請將此標記爲已回答 –

0

這可能是:

SELECT 
    * 
FROM 
    final, 

    (SELECT 
     final.Date, Min(final.Time) As MinTime, Max(final.Time) As MaxTime, final.Angle 
    FROM 
     final 
    GROUP BY 
     final.Date, final.Angle) As T 

WHERE 
    final.Angle = T.Angle AND 
    final.Date = T.Date AND 
    ((final.Time = T.MinTime) OR (final.Time = T.MaxTime)) 
ORDER BY 
    final.Date, final.Time, final.Angle 
+0

不完全是我在找。但非常感謝你真的很有幫助。 – Ayaz49

+0

謝謝你的幫助。 – Ayaz49

0

請記住,除非您還可以選擇從表中的時候,你無法知道哪些值要檢索的方式。所需輸出中的日期和角度不是唯一的組合。

您可能需要稍微修改Access語法。

SELECT 
    final.Date AS dt, 
    MIN(final.Time) AS tm, 
    final.Angle AS ag 
FROM 
    final 
GROUP BY 
    final.Date, final.Angle 
UNION SELECT 
    final.Date, 
    MAX(final.Time), 
    final.Angle 
FROM 
    final 
GROUP BY 
    final.Date, final.Angle 
ORDER BY 
    dt, ag, tm; 

編輯:SQL小提琴例子...... http://sqlfiddle.com/#!9/2f638c/14

+0

@ Ayaz49 - 這是否解決了您的問題? –

+0

謝謝你的回答,這真的很有幫助,雖然輸出不是我正在尋找的。它爲每個日期的每個角度選擇兩條記錄,但是我只想要每個角度兩條記錄。謝謝。 – Ayaz49

+0

只需做一個小小的改動:'select min(final.Date)as dt,min(final.Time)as tm,final.Angle as ag from final group by final.Angle union select max(final.Date), max(final.Time),final.Angle from final group by final.Angle' –