在SQL查询中,是;前1名“;是像MIN()或MAX()这样的聚合函数的可靠替代品吗。。?

在SQL查询中,是;前1名“;是像MIN()或MAX()这样的聚合函数的可靠替代品吗。。?,sql,ms-access,ms-access-2007,Sql,Ms Access,Ms Access 2007,“TOP 1”是否是诸如MIN()和MAX()等聚合函数的可靠替代品。。?下面显示的是Access 2007中的一个基本查询,用于确定客户在某个月内首次订购某个产品的时间。DBMS系统可能与此无关,因为这个问题可能适用于任何系统 在此查询中,“TOP 1”与日期字段上的ORDER BY一起使用。这将返回一条记录,该记录是截止日期最早的记录。但是…这样可以吗。。?会出什么问题。。?有更好的办法吗 SELECT TOP 1 DAACCT, DAITEM, DAQTY, DAIDAT FROM fq

“TOP 1”是否是诸如MIN()和MAX()等聚合函数的可靠替代品。。?下面显示的是Access 2007中的一个基本查询,用于确定客户在某个月内首次订购某个产品的时间。DBMS系统可能与此无关,因为这个问题可能适用于任何系统

在此查询中,“TOP 1”与日期字段上的ORDER BY一起使用。这将返回一条记录,该记录是截止日期最早的记录。但是…这样可以吗。。?会出什么问题。。?有更好的办法吗

SELECT TOP 1 DAACCT, DAITEM, DAQTY, DAIDAT

FROM fqlOrdersGrandHistory

WHERE DAACCT="T7414" AND DAITEM="45234" AND (DAIDAT>=20170501 AND DAIDAT<=20170531)

ORDER BY DAIDAT;
选择前1个数据账户、日期、数量、日期
从历史上看

其中DAACCT=“T7414”和DAITEM=“45234”和(DAIDAT>=20170501和DAIDAT
TOP
用于限制获取的行,是的,除非您有多个具有相同数据的记录,否则没有问题。不确定它与
Min()
Max()
的关系……您使用
Min()
Max()
聚合函数,当您使用
分组依据
对行进行分组时。即使未指定
分组依据
分组也会在整个结果集上进行

可靠是一个主观术语。是的,
顶部1
将给出一个结果,
最大值(
最小值()
。这取决于你想要什么

如果您仅查找特定用户(在本例中,您似乎是这样),并按日期升序排序,并使用
TOP 1
,您将获得该记录的所有详细信息。但是,如果您正在查找表中每个用户的第一次购买,则TOP 1将仅为您提供第一个下订单的人的信息

另一方面,如果使用
选择DAACCT,MIN(DAIDAT)从表GROUP BY DAACCT
中,您将获得每个用户的最早购买。这假设您将
DAIDAT
存储为带有时间组件的日期格式,而不仅仅是日期值本身。如果您这样做,您将打开多个可能的记录


TL;DR:如果您坚持查询的概念1)寻找非常特定的用户2)非常特定的产品3)您的日期存储为正确的日期,
TOP 1
将比聚合函数更好使用。如果不满足这三个条件之一,则重新评估。

如果所选字段的一个字段或字段组合是唯一的,则可以


否则,结果集将包含字段或组合匹配的所有记录。要避免这种情况,请始终在所选字段中包括(例如)自动编号字段。

“但是……这样可以吗?”如果没有多条记录具有相同的日期,则可以。但这与
MIN
不同,
MAX
听起来像是XY问题。我猜您是在“尝试使用聚合函数,但同时显示其他列”,但您不想对它们进行分组?有办法解决这个问题。正如Tim所说,假设您是按唯一值排序的,那么排序和使用select top 1是一种解决方法。是的,正是这样。我有一个返回一组发票的查询,我想把它缩小到日期最早的一个。所以我至少需要发票号码和日期字段。如果我在那个场景中使用MIN(),它就不起作用了,因为发票号不同。虽然我理解这是因为每个记录及其所有字段都是作为一个整体进行评估的,但我还没有找到/理解这个基本问题的解决方案。您也可以使用
MIN
/
MAX
WHERE
(他使用的)。当然,这与从单个记录中选取值的
TOP 1
不同,而
MIN
MAX
可能从不同的记录中选取值。问题还有两个层次。我刚刚和一位同事讨论了独特性的问题。我需要做的是从查询中获取最早的日期,我刚刚被告知这可能导致多个结果,因为在某些情况下,我们会在同一天向一个客户发送多张发票。所以…然后我需要得到这些数字中的任何一个,并选择一个前1位的数字,因为这是查询的最终日期。现在我想起来了…我想TOP 1可以很好地解决这个问题。这个系统将日期存储为一个长整数,格式为YYYYMMDD。比如今天是20170628。在与同事讨论这个问题后,TOP 1应该会起作用。如果那天有多张发票,那就选一张吧,因为这是我们要找的日期。附带的发票编号,可包括在内以供参考。