限制组数的Sql查询

限制组数的Sql查询,sql,Sql,您好,我有一个表,其中包含以下字段“站点代码”“日期”“小时”“数量”,我希望在查询中获取上周输入的所有数据。但是一个日期可以有多个输入,所以我必须先根据日期分组,然后在DESC中对这些组进行排序,最后选择7个。但是,我使用的查询并不能正常工作,因为它对组进行排序,但在有多个输入的几天内,我只能得到其中的一个。 查询是: SELECT `Quantity` , `Hour` , `Date` FROM ( SELECT * FROM `13_trans_coffee`

您好,我有一个表,其中包含以下字段“站点代码”“日期”“小时”“数量”,我希望在查询中获取上周输入的所有数据。但是一个日期可以有多个输入,所以我必须先根据日期分组,然后在DESC中对这些组进行排序,最后选择7个。但是,我使用的查询并不能正常工作,因为它对组进行排序,但在有多个输入的几天内,我只能得到其中的一个。 查询是:

SELECT `Quantity` , `Hour` , `Date`
FROM (
      SELECT *
      FROM `13_trans_coffee`
      WHERE `Site Code` =103713
      GROUP BY `Date`
      ORDER BY `Date` DESC
     )days
LIMIT 0 , 7
样本数据

site code  date            hour    quantity
103713     5/12/2011 0:00  21      10
103713     5/12/2011 0:00  20      11
103713     4/12/2011 0:00  14      10
103713     6/12/2011 0:00  20      10
103713     8/12/2011 0:00  23      10
请注意,我在2011年5月12日有2个输入,但查询结果是

quantity   hour    date
10         23      8/12/2011 0:00
10         20      6/12/2011 0:00
11         20      5/12/2011 0:00
10         14      4/12/2011 0:00
缺少一个输入。

您使用的分组方式不正确。为了你想要的,完全忽略它

每当按Foo分组时,输出中只会出现唯一的Foo,而在您的情况下,恰好是日期

从SQL的角度来看,这是完全正确的。您甚至在查询中提到要按日期分组,当您按字段分组时,它会查找该字段的所有实例并对其进行概括/汇总

在您的样本数据中,您按值5/12/2011分组两次。您不能期望在仅按日期分组的情况下获得该日期的两个条目

如果您想获得5/12的两个条目,您需要按日期和小时分组,时间和日期的组合将为您提供5/12的两个条目。请注意,如果两个元组之间的小时/分钟数相同,那么这也会产生一个元组。如果您想要一个日期的多个实例,则根本不需要按分组


我唯一能想到的另一件事是,为什么你所在领域的时间都设置为0:00?如果您的实际值一直到秒/分钟,那么您可能可以使用一个日期分组来处理多个元组。

下面的一个应该可以

SELECT * 
FROM `13_trans_coffee`
WHERE  `Site Code` =103713 AND `Date` 
IN
(
SELECT `Date`
FROM `13_trans_coffee`
WHERE `Site Code` =103713
GROUP BY `Date`
ORDER BY `Date` DESC
LIMIT 0 , 7
) Z;

如果您想要最后7个填充日期

SELECT
  *
FROM
  `13_trans_coffee`
WHERE
  `Site Code` = 103713
  AND `Date` >= (SELECT MIN(`Date`) FROM (SELECT `Date` FROM `13_trans_coffee` WHERE `Site Code` = 103713 ORDER BY `DATE` DESC LIMIT 0,7))
ORDER BY
  `Date` DESC
或者

如果你想要最后7天加上今天

SELECT
  *
FROM
  `13_trans_coffee`
WHERE
  `Site Code` = 103713
  AND `Date` >= CURDATE() - 7
ORDER BY
  `Date` DESC

您可以标记您正在使用的DBMS吗?我在考虑分析函数,但我不知道您需要什么语法。

如果有几天没有数据,极限方法将提供超过1周的数据。这就是你想要的吗?是的,我想不会有。你的样本数据有差距;但是,如果你不希望出现差距,你能用Date>=CURDATE-7来代替吗?我想我可以这样做作为最后的选择。这并不是最后的选择。如果您对数据有这样的了解,那么这实际上是一种优化,并且将是我的首选-我希望这是最快的。如果您不具备这方面的知识,那么我希望Date>=SELECT MINDate FROM SELECT LIMIT 0,7是最快的。这是因为使用范围操作符几乎总是比使用IN、JOIN等更快;查询范围一次比查询特定值7次更方便…@Dems-这正是我回答问题的原因,请阅读我的答案。如果我按日期和小时分组,我将获得额外的输入,但我将两次计算该日期,我想计算7天。它们被设置为0,以便作为同一组进行分组,这意味着1天。在内部和外部查询中都需要站点代码where子句。为什么?我正在过滤掉该特定站点代码的内部查询中的所有记录。我们在外部查询中不需要站点代码。目前,您只说站点103713有数据的日期。但是,如果系统中的其他每个站点都有这些日期的数据,该怎么办?你也会把所有这些网站的记录都拉出来,因为外部条款只限制了日期而不是网站的选择。。但是内部查询没有给出任何其他结果,除了站点代码103713,对吗?@Venk-想象两个站点的数据。一个有日期1,2,3,4,5,6,7的数据,另一个有日期1,2,3,4,5,6,7,8,9的数据。然后,您的查询分为两部分。内部查询为一个特定站点建立7个最近日期;在我们的例子中,可能是3,4,5,6,7,8,9。外部查询然后选择这些日期的数据。但是在日期3、4、5、6、7这两个站点都有数据,您的查询将返回这两个站点的数据。尽管内部查询具有“按站点筛选”功能,但这不会筛选外部查询。要获得op要求的内容,您需要在两个位置都使用where子句。
SELECT
  *
FROM
  `13_trans_coffee`
WHERE
  `Site Code` = 103713
  AND `Date` >= CURDATE() - 7
ORDER BY
  `Date` DESC