Microsoft Query Group / Partition By

时间:2014-04-15 19:49:24

标签: sql excel excel-vba vba

假设我在数据库中有以下数据,我试图通过Excel中的Microsoft Query进行查询:

Col_A:     Col_B:     Col_C:    Col_D:    Date1:     Date2:
a1         b1         c1        d1        Dt1_1      Dt2_1
a1         b2         c2        d2        Dt1_1      Dt2_2
a1         b3         c3        d3        Dt1_1      Dt2_3
a1         b4         c4        d4        Dt1_2      Dt2_4
a1         b5         c5        d5        Dt1_2      Dt2_5

并且,就日期而言,假设,例如," _1" < " _2&#34 ;. 因此,对于Col_A中的每个值,我想要的是为最早的Date1为每个Date2获取一行。

所以,鉴于这些数据,我想回来:

Col_A:     Col_B:     Col_C:    Col_D:    Date1:     Date2:
a1         b1         c1        d1        Dt1_1      Dt2_1
a1         b4         c4        d4        Dt1_2      Dt2_4

换句话说,由于Date1已更改,我们会获取最早Date2的数据。 我希望这是有道理的。

在MySQL中,我相信查询看起来像:

SELECT Col_A, Col_B, Col_C, Col_D, Date1, Date2
FROM MyTable
ORDER BY Col_A, Date1, Date2
GROUP BY Col_A, Date1, Date2 

或类似的东西:

SELECT Col_A, Col_B, Col_C, Col_D, Date1, Date2,
       RANK() OVER(PARTITION BY Col_A, Date1 ORDER BY Date2) as RN
FROM MyTable
WHERE RN = 1
ORDER BY Col_A, Date1, Date2

......我知道这不会奏效,但逻辑几乎就是我所寻找的......

但我不知道如何在Microsoft Query中执行此操作。

我希望这有道理!!

谢谢!

1 个答案:

答案 0 :(得分:1)

Microsoft Query不会为您提供很多选项,因此您最好将其创建为数据库中的视图。这是MSSQL SQL来设置它:

CREATE VIEW MyView AS
WITH M_CTE(M_COL_A, M_Date1, M_Date2)
AS(
  SELECT A.[Col_A]
      ,A.[Date1]
      ,MIN(A.[Date2]) AS Date2
  FROM [Sheet1] A
  GROUP BY A.[Col_A]
  ,A.[Date1])
SELECT B.* FROM [Sheet1] B
INNER JOIN M_CTE
ON B.Col_A = M_COL_A
AND B.Date1 = M_Date1
AND B.Date2 = M_Date2  

然后,您可以使用Excel中的MS Query轻松连接到视图。