mysql SQL从最近日期提取多个月的数据

wvyml7n5  于 2023-03-07  发布在  Mysql
关注(0)|答案(3)|浏览(183)

我在mysql数据库中有以下日期和颜色的数据

2023-01-28 red
2023-01-29 blue
2023-01-30 blue
2023-01-31 red
2023-02-01 blue
2023-02-02 blue
2023-02-03 blue
2023-02-04 blue
2023-02-05 red

如何从每个月中提取最接近当前日期的日期以及相关的颜色?上面代码的示例答案是

2023-01-31 red
2023-02-05 red
kx5bkwkv

kx5bkwkv1#

我没有MySQL,因此,我将使用SQL Fiddle。

-- 1 - Create table
CREATE TABLE IF NOT EXISTS colors 
(
    the_date DATE,
    the_color VARCHAR(16)
)  ENGINE=INNODB;

-- 2 - Add data
INSERT INTO colors VALUES ('2023-01-28', 'red');
INSERT INTO colors VALUES ('2023-01-29', 'blue');
INSERT INTO colors VALUES ('2023-01-30', 'blue');
INSERT INTO colors VALUES ('2023-01-31', 'red');
INSERT INTO colors VALUES ('2023-02-01', 'blue');
INSERT INTO colors VALUES ('2023-02-02', 'blue');
INSERT INTO colors VALUES ('2023-02-03', 'blue');
INSERT INTO colors VALUES ('2023-02-04', 'blue');
INSERT INTO colors VALUES ('2023-02-05', 'red');

步骤1和2创建表格并添加数据。步骤3将日期转换为YYYYMM格式以便分组和聚合。然后按新字段和颜色分组,使用MAX()函数选择最大的日期。
我本可以将新列保留在最终结果中,但结果集中没有它。因此,使用派生表在()内部语句中获取结果,并在外部语句中选择所需的两个字段(列)。

-- 3 - Solve the problem
SELECT
  the_color,
  the_largest_dte
FROM
(
SELECT 
  DATE_FORMAT(the_date, '%Y%m') as the_yyyy_mm,
  the_color,
  max(the_date) as the_largest_dte
FROM colors
GROUP BY
  DATE_FORMAT(the_date, '%Y%m'),
  the_color
) AS D

下面的屏幕截图显示了所有内容。

http://sqlfiddle.com/#!9/1700b5/7/0

ny6fqffe

ny6fqffe2#

正如我在问题的评论中提到的,您必须使用MAX function
我不确定我是否理解你的要求,但我想你想得到所有的颜色示例,哪一天是最新的...

WITH MD AS
(
  SELECT MAX(datefld) as maxdate
  FROM mytable
),
CR AS
(
  SELECT datefld, colorfld
  FROM mytable AS MT
  INNER JOIN MD
    ON MT.datefld = MD.maxdate
)
SELECT MT.*
FROM CR
INNER JOIN mytable AS MT
  ON MT.colorfld = CR.colorfld
    AND MT.datefld <= CR.datefld
ORDER BY MT.datefld;

SQLFiddle
结果:
| 日期字段|彩色场|
| - ------|- ------|
| 2023年1月28日00时00分|红色|
| 2023年1月31日上午00时00分|红色|
| 2023年2月5日00时00分|红色|

lp0sw83n

lp0sw83n3#

我得到了你想要的输出。

with td as (select *,datediff(CURRENT_DATE(),tdate) ds from temp_data)
select tdate,color from td where ds in
  (
with tp as(
select month(tdate), min(datediff(CURRENT_DATE(),tdate)) as days from temp_data group by month(tdate))
select days from tp)

https://dbfiddle.uk/92RoM59i

相关问题