繁体   English   中英

access - row_number函数?

[英]access - row_number function?

我有这个查询,它给了我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上翻译上面的查询,其中分析函数不存在...

我用这个答案来构建下面的查询

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)子查询中,主表被引入两次。 一个版本是用于显示结果的版本,另一个版本用于计算记录以生成序列号。

戈登说你需要为每一行提供一个唯一的id列。 如果通过“列”表示也包含派生列,那也是如此。 此外,它只需要在“internal_reference”和“Movement_date”的任意组合中是唯一的。

我假设,也许是错误的,PO_Number就足够了。 如果没有,请与其他字段(以及一些分隔符)连接,使其成为唯一的字段。 where子句需要更新以比较“使这个唯一的列的组合”的t1和t2。

如果,没有合适的组合,我不确定如果没有VBA和/或临时表,可以像The-Gambill建议的那样完成。

据我所知,这是MS Access的真正痛苦。 一种方法是相关子查询,但每行需要一个唯一的id列:

SELECT t.*,
       (SELECT COUNT(*)
        FROM (SELECT "Internal_reference", MAX("Movement_date") AS maxtime
              FROM dw."LO-D4_Movements"
              GROUP BY "Internal_reference"
             ) as t2
        WHERE t2."Internal_reference" AND t."Internal_reference" AND

              t2."Movement_date" = t."Movement_date" AND
              t2.?? <= t.??
       ) 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";

?? 用于id或创建日期或允许计数行的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM