【问题标题】:Insert values into temp Table with Partition By使用 Partition By 将值插入临时表
【发布时间】:2014-02-05 01:48:14
【问题描述】:

如果有一个临时表声明如下:

CREATE TABLE #tempKleerkast(
id INT IDENTITY NOT NULL PRIMARY KEY,
IDKleerkastPersoon int,
ID_Persoon int,
rk int
)

现在我希望用实际表中的值填充表,我想在该表中获取每个人的 最新(非最大值)记录。因此我使用以下查询:

      SELECT 
      DISTINCT IDKleerkastPersoon AS Expr1, kk.ID_Persoon,
      ROW_NUMBER() OVER (PARTITION BY kk.ID_Persoon
                            ORDER BY kk.IDKleerkastPersoon DESC) AS rk
      FROM KleerkastPerPersoon kk
      WHERE  kk.ID_Persoon IS NOT NULL AND rk = 1

问题是我希望在哪里使用 insert into,如下所示:

      INSERT INTO #tempKleerkast(IDKleerkastPersoon,ID_Persoon,rk)
      SELECT 
      DISTINCT IDKleerkastPersoon AS Expr1, kk.ID_Persoon,
      ROW_NUMBER() OVER (PARTITION BY kk.ID_Persoon
                            ORDER BY kk.IDKleerkastPersoon DESC) AS rk
      FROM KleerkastPerPersoon kk
      WHERE  kk.ID_Persoon IS NOT NULL AND rk = 1

我收到以下错误:列名“rk”无效。 知道为什么他不认识 rk 列吗?

注意: 在存储过程中需要进一步的列 rk。所以我不能排除它。

【问题讨论】:

  • 问题是关于我的 sql 语句(语法)。与使用 sql-server(产品)无关。因此标签 sql 而不是 sql-server
  • 但是你应该为你正在使用的任何 other 具体数据库添加一个标签; SQL 标准中没有定义很多东西,但它们因供应商而异……(例如,并非所有数据库供应商和系统都支持OVER(PARTITION BY...) 构造……)
  • 修改了标签!它现在应该包含 sql-servertag。我会牢记在未来更清楚地指定它

标签: sql sql-server temp-tables sql-insert row-number


【解决方案1】:

不,问题出现在您编写INSERT 之前。尝试只运行普通的SELECT,你会看到完全相同的错误。 LogicallyWHERESELECT 之前运行,所以不能在前者中引用后者引入的别名。

这应该可行:

  INSERT INTO #tempKleerkast(IDKleerkastPersoon,ID_Persoon,rk)
  SELECT IDKleerkastPersoon, ID_Persoon, rk
  FROM (
     SELECT
       IDKleerkastPersoon, kk.ID_Persoon,
          ROW_NUMBER() OVER (PARTITION BY kk.ID_Persoon
                        ORDER BY kk.IDKleerkastPersoon DESC) AS rk
     FROM KleerkastPerPersoon kk
     WHERE  kk.ID_Persoon IS NOT NULL) t
  WHERE rk = 1

(我还删除了DISTINCT,因为列出的列之一也是PARTITION BY 子句中列出的列,我们只从每个分区中选择一行)

【讨论】:

  • 您的解决方案非常有效!我想将来应该对任何其他聚合(AVG,SUM,MAX,...)使用相同的逻辑(用于插入到临时表中)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
相关资源
最近更新 更多