【问题标题】:MS Access queryMS Access 查询
【发布时间】:2011-07-21 10:56:06
【问题描述】:

我正在使用 MS 访问。 我有一个名为 CHANGES 的表,其中包含列

( CNO (int) , TNO (int), DATE_C).

我想编写一个显示最近日期的 SQL 查询,并仅按 CNO 对其进行分组。但我也想显示 TNO。

SELECT tno, cno, max(date_c)
FROM changes
WHERE [Date_c] In (SELECT [date_c] FROM changes  WHERE [date_c]<=[Enter date])
GROUP BY cno;

【问题讨论】:

    标签: sql ms-access ms-access-2003


    【解决方案1】:

    在 SQL 中大约有七种方法可以做到这一点(因为总是有:),这是 Stackoverflow 上经常被问到的问题。这是一个:(为了清楚起见,我省略了您的 date_c &lt;= [Enter date] 参数,因为我无法测试——我没有使用 Access 接口!):

    SELECT DISTINCT C1.tno, C1.cno, 
           DT1.c_most_recent_date
      FROM changes AS C1
           INNER JOIN (
                       SELECT C2.cno, 
                              MAX(C2.c_date) AS c_most_recent_date
                         FROM changes AS C2
                        GROUP
                           BY C2.cno
                      ) AS DT1 
              ON C1.cno = DT1.cno;
             AND C1.c_date = DT1.c_most_recent_date;
    

    还有一个:

    SELECT DISTINCT C1.tno, C1.cno, 
           C1.c_date AS c_most_recent_date
      FROM changes AS C1
     WHERE NOT EXISTS (
                       SELECT *
                         FROM changes AS C2
                        WHERE C2.cno = C1.cno
                              AND C1.c_date < C2.c_date
                      );
    

    【讨论】:

    • 非常感谢。这是一个很大的帮助:) 它解决了我的问题。
    【解决方案2】:

    这没有任何意义。如果您正在为 CNO 分组,则您不能显示 TNO 相同的 CNO 可能不同。如果你想显示任何TNO,你可以这样做:

    SELECT FIRST(tno), cno, max(date_c)
    FROM changes
    WHERE [Date_c] In (SELECT [date_c] FROM changes  WHERE [date_c]<=[Enter date])
    GROUP BY cno;
    

    或者这个:

    SELECT LAST(tno), cno, max(date_c)
    FROM changes
    WHERE [Date_c] In (SELECT [date_c] FROM changes  WHERE [date_c]<=[Enter date])
    GROUP BY cno;
    

    但如果你想同时显示两者,通常你想按两者进行分组。 (即使你说你不想)。

    【讨论】:

    • 这对我来说很有意义,我将尝试解释如何:) 考虑一个客户姓名的“历史”表,其中包含 {customer_ID, customer_name, start_date, end_date} 列,并带有一个顺序键,以防止相同 @987654328 的重叠时段@ 和 (customer_ID, customer_name) 上的常规键(业务规则 = 不能重用以前的名称)。要查找最近的名称何时生效,我们可以按customer_ID 分组并找到MAX(start_date) 然后 加入表以找到customer_name 的start_date。当然还有其他方法……
    • ...按customer_ID 和customer_name 分组并不是我们想要的,因为在这种情况下这只会为每一行创建一个组,因为它是一个键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多