【问题标题】:Extract Latest Records提取最新记录
【发布时间】:2011-05-06 04:28:35
【问题描述】:

我有一张这样的桌子:

SKU  AVG_COST   DATE        TIME
--------------------------------------------
AAA  1.50       20110301    110331
AAA  1.52       20110302    140005
AAA  1.54       20110303    150301
AAA  1.56       20110303    150302
AAA  1.56       20110303    150303
BBB  2.04       20110408    160258
BBB  2.05       20110409    140808
BBB  2.06       20110410    130509
BBB  2.07       20110411    152331
BBB  2.08       20110411    152332

使用 SQL 的预期结果应该如下所示:

SKU  AVG_COST   DATE        TIME
---------------------------------------
AAA  1.56       20110303    150303
BBB  2.08       20110411    152332

我正在尝试提取最新的 SKU 行。

【问题讨论】:

  • 你有这个表的主键吗?

标签: sql


【解决方案1】:
SELECT *
FROM tableName
WHERE (sku, date) IN
(
    SELECT sku, MAX(date)
    FROM tableName
    GROUP BY sku
);

同时考虑时间:

SELECT *
FROM tableName
WHERE (sku, date, time) IN
(
    SELECT sku, date, MAX(time)
    FROM tableName
    WHERE (sku, date) IN
    (
        SELECT sku, MAX(date)
        FROM tableName
        GROUP BY sku
    )
    GROUP BY sku, date
);

正如 OMG Poines 所指出的,这种方法仅适用于支持 where 子句中的元组的数据库。

更新

这是一种没有元组的方法:

SELECT *
FROM tableName t
WHERE t.date = (SELECT MAX(date) FROM tableName WHERE sku = t.sku)
AND t.time = (SELECT MAX(time) FROM tableName WHERE sku = t.sku AND date = t.date);

在我的本地 postgres 服务器上进行的快速测试表明这种方法速度较慢,但​​是我设置用于测试的表没有索引,所以 YMMV。

【讨论】:

  • 不是每个数据库都支持元组
  • 对不起,我不熟悉各种各样的数据库,但我认为这是一种非常便携的方法。哪些主要的数据库不支持这种 where 子句?
  • 对不起,这是我的错误。我会再试一次。
  • @Bob:如果它对你有用,请接受这个答案。干杯! :)
【解决方案2】:

我很确定这会为您解决问题:

SELECT SKU, AVG_COST, MAX(DATE), MAX(TIME)
FROM TABLE
Group BY SKU, AVG_COST

【讨论】:

  • 这将为每个 sku 和 avg_cost 配对返回重复项。并且 MAX 不会返回与大多数行关联的值。
  • 啊,没想到sku需要最大日期和时间,ave_cost不应该分组。有点复杂
【解决方案3】:

查询看起来像这样

select * 
from table 
group by sku 
having max(AVG_COST) 
order time desc

【讨论】:

  • 只有 SQLite 和 MySQL 支持从 GROUP BY 中省略列,而您指定的 HAVING 子句没有任何作用。
  • 如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行,然后单击编辑器上的“代码示例”按钮 ({ })工具栏以很好地格式化和语法突出显示它!
猜你喜欢
  • 2012-01-12
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2012-02-12
  • 2018-10-17
相关资源
最近更新 更多