Mysql SQL查询以提取最近的部分以及比该日期早30天的任何内容。

Mysql SQL查询以提取最近的部分以及比该日期早30天的任何内容。,mysql,sql,sql-server,Mysql,Sql,Sql Server,我对SQL非常陌生,需要编写一个查询来为特定部分选择数据。但是,它应该只选择日期最新的零件以及日期前30天的任何零件。请考虑下表: PartID | Part_NAME | DATE ----------------------------- 1 AAA 6/16/2015 2 BBB 6/15/2015 3 AAA 6/11/2015 4 AAA 1/1/2008 我需要一个查询,可以提供

我对SQL非常陌生,需要编写一个查询来为特定部分选择数据。但是,它应该只选择日期最新的零件以及日期前30天的任何零件。请考虑下表:

PartID | Part_NAME | DATE
-----------------------------
  1        AAA     6/16/2015
  2        BBB     6/15/2015
  3        AAA     6/11/2015
  4        AAA     1/1/2008
我需要一个查询,可以提供:

PartID | Part_NAME | DATE
-----------------------------
  1        AAA     6/16/2015
  3        AAA     6/11/2015  
我试过:

select * from ( select * from sales_table where Part_NAME = 'AAA') where DATE BETWEEN (max(DATE) and  (max(DATE)-30))

我读过一些文章,说我不能同时使用WHERE和max等函数,并建议我使用groupby或have,但它对我也不起作用。谢谢。

您可以通过使用datediff和getdate以及子查询来完成

SELECT * FROM (
    SELECT *,DATEDIFF(DD,[DATE],GETDATE()) AS DAYSBETWEEN FROM sales_table 
    ) AS X
    WHERE DAYSBETWEEN <= 30

如果您需要过去30天的数据,则应为:

select st.*
from sales_table st join
     (select top (1) st2.*
      from sales_table st2
      order by st2.date desc
     ) st2
     on st2.part_name = st.part_name and
        st.date >= dateadd(day, -30, cast(getdate() as date));

如果您需要当天最后30天的数据,可以执行以下操作:

SELECT * 
FROM sales_table 
WHERE 
    [DATE] >=  DATEADD(DAY, -30,GETDATE())
AND [DATE] <=  GETDATE()
AND  Part_NAME = 'AAA'
SELECT * 
FROM (
SELECT *, 
    MAX([DATE]) OVER(PARTITION BY Part_NAME ORDER BY PartID) AS RecentDate 
FROM sales_table 
) D
WHERE 
    [DATE] >=  DATEADD(DAY, -30, RecentDate)
AND [DATE] <=  RecentDate
AND  Part_NAME = 'AAA'