【问题标题】:SQL: reverse groupby : EDITSQL:反向分组:编辑
【发布时间】:2017-05-16 12:56:09
【问题描述】:

在 sql 中是否有一个内置函数来反转 groupby 的工作顺序?我尝试按某个键进行分组,但我希望返回最后插入的记录,而不是第一个插入的记录。

使用 orderby 更改顺序不会影响此行为。

提前谢谢!

编辑:

这是样本数据:

id|value
-----
1 | A
2 | B
3 | B
4 | C

作为我想要的回报

1 | A
3 | B
4 | C

不是

1 | A
2 | B
4 | C

当使用 group by id 时没有得到我想要的结果。

【问题讨论】:

  • 请向我们展示一些示例数据来说明您的问题。
  • 请提供样本数据和预期结果。我不清楚这个问题,样本数据将有助于澄清。在我看来,你想要一个日期的最大值,或者你想选择 max(Inserted),ID group by ID 然后加入到基本集以获取每个组的最新记录?
  • GROUP BY 不返回“样本”记录。你应该有适当的聚合函数来获得你想要的值。
  • LAG 函数将返回查询的最后一行,如果这是您真正要求的,但您的问题非常不清楚。
  • GROUP BY w/o 聚合真的没有意义。您此时没有聚合。您真正需要分组依据的唯一时间是当您使用 min/max/avg 等时...如果您有重复的记录要删除,我会使用 distinct 来明确含义。

标签: sql group-by eloquent


【解决方案1】:

这里的问题是您如何识别last inserted row。根据您的示例,它看起来像基于id。如果id 是自动生成的,或者是一个序列,那么你绝对可以这样做。

select max(id),value
from your_table
group by value 

理想情况下,在表格设计中,人们使用日期列来保存插入特定记录的时间,因此很容易按此排序。

【讨论】:

    【解决方案2】:

    使用 Max() 作为 id 的聚合函数:

    SELECT max(id), value FROM <table> GROUP BY value;
    

    这将返回:

    1 | A
    3 | B
    4 | C
    

    至于eloquent,我没用过,但我觉得应该是这样的:

    $myData = DB::table('yourtable')
                     ->select('value', DB::raw('max(id) as maxid'))
                     ->groupBy('value')
                     ->get();
    

    【讨论】:

    • 如何将其转换为“雄辩”?
    猜你喜欢
    • 2021-01-12
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2013-09-23
    • 2019-11-06
    • 2012-08-10
    相关资源
    最近更新 更多