【发布时间】:2018-02-28 16:18:27
【问题描述】:
我已经完成了一个包含 LEAD 的存储过程,不幸的是该脚本必须在 2008 年运行,所以有人知道如何在 2008 年实现这一目标吗?
INSERT INTO #ARTICLES(EAN, ID_ART, QTE, PV_NET_HT)
SELECT EAN, ID_ART, QTE_CDE, PA_NET
FROM (
SELECT TEXTE_LIG,
CASE WHEN TEXTE_LIG LIKE '%++%' THEN ID_ART ELSE LEAD(ID_ART) OVER (ORDER BY (SELECT NULL)) END AS ID_ART,
CASE WHEN TEXTE_LIG LIKE '%++%' THEN CHAR01 ELSE LEAD(CHAR01) OVER (ORDER BY (SELECT NULL)) END AS EAN,
LEAD(QTE_CDE, CASE WHEN TEXTE_LIG LIKE '%++%' THEN 1 ELSE 2 END) OVER (ORDER BY (SELECT NULL)) AS QTE_CDE,
LEAD(PX_BASE, CASE WHEN TEXTE_LIG LIKE '%++%' THEN 2 ELSE 3 END, NULL) OVER (ORDER BY (SELECT NULL)) AS PX_BASE,
LEAD(PX_NET, CASE WHEN TEXTE_LIG LIKE '%++%' THEN 2 ELSE 3 END, NULL) OVER (ORDER BY (SELECT NULL)) AS PA_NET
FROM AMAZON_ACHATS_LIG
WHERE ID_ACHATS_ENT = @IDENTITY
) AS LIGNE
WHERE TEXTE_LIG LIKE 'LIN%';
【问题讨论】:
-
在 sql server 2012 之前,你需要做一个 self join,。
-
旁注:
LEAD(column) OVER (ORDER BY (SELECT NULL))是荒谬的。ORDER BY (SELECT NULL)表示前导窗口函数将返回任意行。 (注意,任意不等于随机)。 -
查询工作正常,没有 order by,因为我不希望它们被订购。我必须在 2008 年做到这一点
-
这很难读。我什至不打算尝试。继续前进。
-
@user1340587,如果您不想订购它们,为什么要使用 LEAD?这会得到“NEXT”值,这意味着顺序。
标签: sql sql-server sql-server-2008 window-functions