我正在使用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;
答案 0 :(得分:0)
这没有任何意义。如果您要为TNO
分组,则无法显示CNO
相同CNO
的{{1}}是否有所不同。如果你想显示任何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;
但通常你想要两者分组,如果你想同时显示两者。 (即使你说你不想)。
答案 1 :(得分:0)
在SQL中有大约七种方法可以做到这一点(因为总是有:)并且是Stackoverflow上经常被问到的问题。这是一个:(为了清楚起见,我省略了你的date_c <= [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
);