【问题标题】:Get record by max(date), where date can be null [duplicate]按 max(date) 获取记录,其中 date 可以为 null [重复]
【发布时间】:2019-08-12 00:27:37
【问题描述】:

我正在尝试选择每个 user_id 具有最高 date_end 值的行。 date_end 可以为空,在这种情况下,我假设当前(或给定)日期:

数据:

CREATE TABLE `prices_test` (
  `id` int(10) unsigned NOT NULL DEFAULT '0',
  `user_id` int(10) NOT NULL,
  `date_end` date DEFAULT NULL,
  `price` decimal(10,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of prices_test
-- ----------------------------
INSERT INTO `prices_test` VALUES ('2', '2', '2018-11-29', '30000.00');
INSERT INTO `prices_test` VALUES ('3', '6', '2018-07-29', '20000.00');
INSERT INTO `prices_test` VALUES ('4', '18', '2017-12-31', '3999.00');
INSERT INTO `prices_test` VALUES ('7', '18', '2018-03-01', '10000.00');
INSERT INTO `prices_test` VALUES ('10', '6', null, '44000.00');
INSERT INTO `prices_test` VALUES ('13', '62', '2018-08-26', '12000.00');
INSERT INTO `prices_test` VALUES ('16', '62', null, '36500.00');
INSERT INTO `prices_test` VALUES ('17', '68', '2014-06-15', '22000.00');
INSERT INTO `prices_test` VALUES ('18', '69', null, '36500.00');
INSERT INTO `prices_test` VALUES ('19', '60', null, '10000.00');
INSERT INTO `prices_test` VALUES ('20', '68', null, '30000.00');

我正在尝试使用的查询:

SELECT t.* 
FROM prices_test t 
INNER JOIN (
  SELECT id, user_id, MAX(IFNULL(date_end, '2019-03-21')) AS date_end
  FROM prices_test GROUP BY id
) AS max USING (id, date_end);

sql 小提琴:http://sqlfiddle.com/#!9/9e61e0/4

问题是我的查询似乎忽略了 MAX()。它选择 id=3 的 user_id,但我希望 id=10 因为 IFNULL(date_end, '2019-03-21') 从 id=3 给 id=10 的日期比 '2018-07-29' 更高,对吧?其他所有的 ID 也不如这里预期的那样。

我做错了什么?

【问题讨论】:

  • 您使用的是哪个版本的 MySQL?

标签: mysql sql aggregate-functions


【解决方案1】:

使用相关子查询

DEMO

select * from prices_test a
where id in (select max(id) from prices_test b where a.user_id=b.user_id)

select * from prices_test a
    where coalesce(date_end,'2019-03-21') in (select max(coalesce(date_end,'2019-03-21')) from prices_test b where a.user_id=b.user_id)

【讨论】:

    【解决方案2】:

    您不应该使用 group by id .. 这样可以获得每个 id 的最大值 (每行)而不是每个 user_id .. 也尝试对 id 列使用聚合函数

    SELECT t.* 
    FROM prices_test t 
    INNER JOIN (
      SELECT max(id), user_id, MAX(IFNULL(date_end, '2019-03-21')) AS date_end
      FROM prices_test 
      GROUP BY user_id
    ) AS max USING (id, date_end);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-18
      • 2020-06-18
      • 1970-01-01
      • 2019-06-25
      • 2022-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      相关资源
      最近更新 更多