您好我有一个表格,其中包含以下字段'网站代码''日期''小时''数量',我想在查询中获取上周的所有输入数据。但是对于一个日期可能有多个输入,所以我必须先按照日期进行分组,然后在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
缺少一个输入。
答案 0 :(得分:1)
下面的一个应该可以工作。
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;
答案 1 :(得分:1)
如果您想要最后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
或者...
SELECT
*
FROM
`13_trans_coffee`
INNER JOIN
(SELECT `Site Code`, `Date` FROM `13_trans_coffee` WHERE `Site Code` = 103713 GROUP BY `Site Code`, `Date` ORDER BY `DATE` DESC LIMIT 0,7) AS filter
ON filter.`Site Code` = `13_trans_coffee`.`Site Code`
AND filter.`Date` = `13_trans_coffee`.`Date`
ORDER BY
`Date` DESC
如果你想要过去7天(加上今天)......
SELECT
*
FROM
`13_trans_coffee`
WHERE
`Site Code` = 103713
AND `Date` >= CURDATE() - 7
ORDER BY
`Date` DESC
答案 2 :(得分:0)
您错误地使用了GROUP BY
。完全忽略它你想要的东西。
每当GROUP BY
Foo
Foo
时,输出中只显示唯一的{{1}},在您的情况下恰好是日期
答案 3 :(得分:0)
从SQL的角度来看,这是完全正确的。您甚至在查询中提到,当您按字段分组时,它会找到该字段的所有实例并将其概括为/ GROUP BY Date
总结一下。
在您的样本数据中,您使用值5/12/2011(两次)进行分组。您不能指望仅使用group by date
获得该日期的两个条目。
如果您希望获得date
的两个条目,则需要按hour
和5/12
分组,时间和日期的组合将为您提供两个条目(对于{{1}} 5/12)。请注意,如果两个元组之间的小时/分钟相同,则会产生一个元组。如果您想要多个日期实例,则根本不需要进行分组。
我能想到的另一件事就是为什么你的战场时间都设定为0点?如果您的实际值低至秒/分钟,那么您可以使用日期组来获取多个元组。
答案 4 :(得分:0)
您可以标记您正在使用的DBMS吗?我正在考虑分析函数,但我不知道你需要什么语法。