2017-08-16 93 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' –