sql - Access - row_number 函数?

标签 sql postgresql ms-access analytics

我有这个查询,它在 postgres

上给了我想要的结果
SELECT
  t.*,
  ROW_NUMBER() OVER (PARTITION BY t."Internal_reference", t."Movement_date" ORDER BY t."Movement_date") AS "cnt"
FROM (SELECT
  "Internal_reference",
  MAX("Movement_date") AS maxtime
FROM dw."LO-D4_Movements"
GROUP BY "Internal_reference") r
INNER JOIN dw."LO-D4_Movements" t
  ON t."Movement_date" = r.maxtime
  AND t."Internal_reference" = r."Internal_reference"

问题是我必须在分析函数不存在的 Access 上翻译上面的查询 ...

我用了这个answer构建下面的查询

SELECT 
      t."Internal_reference",
      t.from_code,
      t.to_code,
      t."Movement_date",
      t.shipment_number,
      t."PO_number",
      t."Quantity",
      t."Movement_value",
      t."Site",
      t."Import_date",
  COUNT(*) AS "cnt"
 FROM (
      SELECT "Internal_reference",
      MAX("Movement_date") AS maxtime
      FROM dw."LO-D4_Movements"
      GROUP BY "Internal_reference") r
LEFT OUTER JOIN dw."LO-D4_Movements" t
        ON t."Movement_date" = r.maxtime AND t."Internal_reference" = r."Internal_reference"
GROUP BY
      t.from_code,
      t.to_code,
      t."Movement_date",
      t.shipment_number,
      t."PO_number",
      t."Quantity",
      t."Movement_value",
      t."Site",
      t."Import_date",
      t."Internal_reference" 
ORDER BY t.from_code    

问题是我在 cnt 列中只有 1

我试图通过删除 internal_reference 来调整它(见下文)

SELECT 
      t.from_code,
      t.to_code,
      t."Movement_date",
      t.shipment_number,
      t."PO_number",
      t."Quantity",
      t."Movement_value",
      t."Site",
      t."Import_date",
  COUNT(*) AS "cnt"
 FROM (
      SELECT "Internal_reference",
      MAX("Movement_date") AS maxtime
      FROM dw."LO-D4_Movements"
      GROUP BY "Internal_reference") r
LEFT OUTER JOIN dw."LO-D4_Movements" t
        ON t."Movement_date" = r.maxtime AND t."Internal_reference" = r."Internal_reference"
GROUP BY
      t.from_code,
      t.to_code,
      t."Movement_date",
      t.shipment_number,
      t."PO_number",
      t."Quantity",
      t."Movement_value",
      t."Site",
      t."Import_date" 
ORDER BY t.from_code    

然而,结果更糟。 cnt 正在增长,但它给了我错误的 cnt

非常欢迎任何帮助,因为我正在慢慢失去理智。

谢谢


编辑:请找到 sqlfiddle

最佳答案

我认为 Gordon-Linoff 的代码接近你想要的,但是有些拼写错误我无法在不重写的情况下更正,所以这是我的尝试

SELECT
    t1.Internal_reference,
    t1.Movement_date,
    t1.PO_Number as Combination_Of_Columns_Which_Make_This_Unique,
    t1.Other_columns,
    Count(1) AS Cnt
FROM
    ([LO-D4_Movements] AS t1
    INNER JOIN [LO-D4_Movements] AS t2 ON
        t1.Internal_reference = t2.Internal_reference AND
        t1.Movement_date = t2.Movement_date)
    INNER JOIN (
        SELECT
            t3.Internal_reference,
            MAX(t3.Movement_date) AS Maxtime
        FROM
            [LO-D4_Movements] AS t3
        GROUP BY
            t3.Internal_reference
            )  AS r ON
        t1.Internal_reference = r.Internal_reference AND
        t1.Movement_date = r.Maxtime
WHERE  
    t1.PO_Number>=t2.PO_Number
GROUP BY
    t1.Internal_reference,
    t1.Movement_date,t1.PO_Number,
    t1.Other_columns
ORDER BY
    t1.Internal_reference,
    t1.Movement_date,
    Count(1);

除了在 max(movement_date) 子查询内,主表被引入两次。一个版本用于在您的结果中显示,另一个版本用于计算记录以生成序列号。

Gordon 说您需要为每一行设置一个唯一的 id 列。如果“列”指的是还包括派生列,那是真的。此外,它只需要在“internal_reference”和“Movement_date”的任意组合中是唯一的。

我假设 PO_Number 就足够了,这可能是错误的。如果不是,则将其与其他字段(和一些定界符)连接起来,使其独一无二。 where 子句将需要更新以比较 t1 和 t2 以获得“使其唯一的列组合”。

如果没有可用的合适组合,我不确定是否可以按照 The-Gambill 的建议在没有 VBA 和/或临时表的情况下完成。

关于sql - Access - row_number 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42721040/

相关文章:

MySQL:表中最旧和最新日期之间列值的变化

sql - 你如何确定什么应该是主键?

sql - 使用设备的最新数据对一系列设备标记的数据求和

postgresql - 如何在没有磁盘空间的情况下对有很多死行的表进行完全清理?

sql - Access 2010 中的 WHERE 区分大小写

vba - ADP 通过 Access 编码更改 sql 中的 View

javascript - 从字符串 javascript 转换为 Access 日期时间

sql - 在动态 SQL 中使用局部变量不起作用

php - 使用加入或别名获取具有相同报告电子邮件地址的用户的详细信息

sql - 如何在 PostgreSQL 中选择具有级别的表的所有层次结构