代码之家  ›  专栏  ›  技术社区  ›  cutsoy

非常复杂的Group By/Unique/Limit By SQL命令

  •  0
  • cutsoy  · 技术社区  · 15 年前

    我甚至不知道怎么称呼这个:P,但是。。。

    我只有一张桌子,我们称之为“上传”

    id    owner    date
    -----------------------------
    0     foo      20100101120000
    1     bar      20100101120300
    2     foo      20100101120400
    3     bar      20100101120600
    ..    ..       ..
    6     foo      20100101120800
    

    现在,当我想做些什么的时候:

    SELECT id FROM uploads ORDER BY date DESC
    

    id    owner    date
    -----------------------------
    6     foo      20100101120800
    ..    ..       ..
    3     bar      20100101120600
    2     foo      20100101120400
    1     bar      20100101120300
    0     foo      20100101120000
    

    问题:

    我需要什么样的SQL命令才能导致:

    id    owner    date
    -----------------------------
    6     foo      20100101120800
    3     bar      20100101120600
    0     foo      20100101120000
    

    SELECT id FROM uploads WHERE date>=20100101120800-500 ORDER BY date DESC
    

    现在有人知道我该怎么做吗?(因此限制/分组结果)

    (顺便说一句,我知道当我想使用它时,我应该将每个日期(YmdHis=60)转换为Unix时间(=100),但我不需要 正好是5分钟,有时可能会少一分钟……)

    3 回复  |  直到 15 年前
        1
  •  1
  •   Brent Baisley    15 年前

    我不太清楚你想得到什么样的结果,即使是用你的例子。也许是有点舍入和分组的东西。

    SELECT max(id) max_id,owner, (ROUND(date/500)*500) date_interval, max(date) date
    FROM uploads GROUP BY date_interval,owner
    

    你可能想使用地板或天花板而不是圆形,这取决于你想要什么。

        2
  •  1
  •   reinierpost    15 年前

    您需要对表进行自连接,以比较不同元组的日期。 这样,您可以很容易地找到日期间隔不超过500的所有元组对。

    您可以做的事情非常类似:将总时间间隔划分为固定的500个单位范围,然后根据它们所在的时间间隔对表中的所有元组进行集群。为此,首先需要一个带有间隔开始时间的表或查询结果;这可以使用表上的SQL查询和一个函数创建,该函数可以将时间戳“舍入”为间隔开始时间,或者计算间隔序列号。然后,作为第二步,您可以将表与该结果连接起来,根据相应的开始时间对其时间戳进行分组。我不能给出SQL,因为它依赖于DBMS,而且我当然不能告诉您这是否是在您的情况下实现您所需的最佳方法。

        3
  •  1
  •   symcbean    15 年前

    使用内联视图?e、 g.类似于

    SELECT u1.* 
    FROM uploads u1,
    (SELECT date 
        FROM uploads u2
        WHERE u2.owner='foo') datum_points
    WHERE u1.date BETWEEN datum_points.date
        AND DATE_ADD(datum_points.date INTERVAL 5 MINUTES)