【问题标题】:access - row_number function?访问 - row_number 函数?
【发布时间】:2017-03-10 14:43:30
【问题描述】:

我有这个查询,它在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

【问题讨论】:

  • 一种选择是进行生成表查询并添加自动编号字段。
  • 嗨@TheGambill 我只是从那个表中提取数据,我不确定我想创建一个新表,你需要 vba 在 Access 中创建临时表。
  • 有道理...我正在考虑。很久以前去 SQL Server...访问有点生疏。
  • @TheGambill 我说的是 Access-hit,而不是 sqlserver ;)
  • 您能否为您的 PostgreSQL 查询创建一个 SQL Fiddle,以显示一些示例数据和所需结果?

标签: sql postgresql ms-access analytics


【解决方案1】:

我认为 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 的“使这个唯一的列组合”。

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

【讨论】:

    【解决方案2】:

    据我所知,这在 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 或创建日期或允许行计数的内容。

    【讨论】:

    • 嗨@gordon-linoff,感谢您的询问,但t2 来自哪里...?
    • 对不起@gordon-linoff 您的查询在这种情况下不合适
    • 为什么这会得到匿名反对票?这就是您在 MS Access 中模拟 row_number() 的方式。
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多