选择每月每天的第一个元素

时间:2012-03-08 18:33:53

标签: mysql

如何使用mysql查询选择一个月中每天的第一个元素?

我有优惠表 - startdate,所以我可以查看每天,每月,每年我都会收到元素,但是,我想知道如何只获得某个月每天的第一个元素?

5 个答案:

答案 0 :(得分:3)

假设以下

  • 表名为mytable
  • 表的ID为主键
  • 表格具有dt as datatime
  • 你想要2012年2月的第一个id

试试这个:

SELECT B.id FROM
(
    SELECT DATE(dt) date_dt,MIN(dt) dt
    FROM mytable
    WHERE dt >= '2012-02-01 00:00:00'
    AND   dt < '2012-03-01 00:00:00'
    GROUP BY DATE(dt)
) A
LEFT JOIN mytable B USING (dt);

如果任何dt有多个B.id值,请尝试:

SELECT dt,MIN(id) id
(
    SELECT B.id,B.dt FROM
    (
        SELECT DATE(dt) date_dt,MIN(dt) dt
        FROM mytable
        WHERE dt >= '2012-02-01 00:00:00'
        AND   dt < '2012-03-01 00:00:00'
        GROUP BY DATE(dt)
    ) A
    LEFT JOIN mytable B USING (dt)
) AA GROUP BY dt;

答案 1 :(得分:1)

假设startdateDATETIME类型,并且最早的条目是2012年3月最早的DATETIME值:

SELECT DISTINCT *
FROM tbl t1
LEFT JOIN tbl t2
  ON (t2.startdate BETWEEN '2012-02-01 00:00:00' AND '2012-02-29 23:59:59')
  AND t2.startdate < t1.startdate
WHERE (t1.startdate BETWEEN '2012-02-01 00:00:00' AND '2012-02-29 23:59:59')
   AND t2.startdate IS NULL

如果没有重复日期,则您不需要DISTINCT

此查询通过加入同一个月的任何早期记录来工作,因此如果没有加入任何内容,则最早通过消除过程。

本书SQL Antipatterns中详细解释了这种技术。

这也可以通过子查询来解决,但是这种类型的JOIN应该比MySQL更容易优化,而子查询通常会否定索引的使用。

答案 2 :(得分:0)

在不知道你桌子的确切结构的情况下,这样的事情应该有效:

SELECT MIN(offerId) FROM offers WHERE startdate <= '2012-03-06' AND startdate >= '2012-02-06' GROUP BY date(startdate)

答案 3 :(得分:0)

只是为了给这只猫提供一种不同的方法(实际上在SQL Server中更容易实现一次)

SELECT 
   t0.offerId
FROM 
   offers AS t0 LEFT JOIN 
   offersAS t1 ON t0.offerId = t1.offerId AND t1.startDate > t0.startDate AND 
                  (t0.startDate BETWEEN '2012-02-01' AND '2012-03-01') AND
                  (t1.startDate BETWEEN '2012-02-01' AND '2012-03-01')
WHERE 
  t1.col1 IS NULL;

如果您有多个具有相同确切时间的行,则会返回多个值,您可以在应用程序逻辑中或使用子查询进行清除。顺便说一句,这被称为分组最小/最大。

答案 4 :(得分:0)

听起来你正在尝试做类似以下的事情:

SELECT col_1, date_col, col_3 FROM tbl
WHERE
   date_col = ( SELECT min(date_col) FROM tbl
                  WHERE
                       year(date_col) = 2006 AND
                       month(date_col) = 02
               );

这也可用于查找max( date_col )。希望这会有所帮助。