【发布时间】:2022-01-19 13:40:13
【问题描述】:
我试图只从 group by 中选择最后一个,但每次都失败。
使用此查询:
SELECT
s.NABAVNACENA, s.ROBAID, MAX(d.DATUM) AS DATUM
FROM
DOKUMENT d
LEFT OUTER JOIN
STAVKA s ON s.VRDOK = d.VRDOK AND s.BRDOK = d.BRDOK
WHERE
d.VRDOK IN (0, 11, 18, 16, 22, 1, 2, 26, 29, 30)
AND d.DATUM >= '01.01.2021'
AND d.DATUM <= '31.12.2021'
AND s.ROBAID IN (39, 34)
GROUP BY
s.ROBAID, s.NABAVNACENA
我得到了这些结果
NABAVNACENA ROBAID DATUM
---------------------------------
149 39 01.01.2021
130 39 03.01.2021
137 39 08.01.2021
847 34 02.01.2021
820 34 03.01.2021
但是,所需的结果只有两行,由 ROBAID 分组,最大日期。
在这种情况下:
137 39 08.01.2021
820 34 03.01.2021
当我从查询中排除 s.NABAVNACENA 时,它确实只返回这两行,但当我包含它时,它会显示所有内容。
我从 Stack Overflow 尝试了很多东西,但我数不清了,现在我不知道该怎么办了。
这是表结构
/* Table: STAVKA, Owner: SYSDBA */
CREATE TABLE "STAVKA"
(
"STAVKAID" INTEGER NOT NULL,
"VRDOK" SMALLINT NOT NULL,
"BRDOK" INTEGER NOT NULL,
"MAGACINID" SMALLINT NOT NULL,
"ROBAID" INTEGER NOT NULL,
"VRSTA" SMALLINT,
"NAZIV" VARCHAR(200),
"NABCENSAPOR" NUMERIC(15,4),
"FAKTURNACENA" NUMERIC(15,4),
"NABCENABT" DOUBLE PRECISION,
"TROSKOVI" NUMERIC(15,4),
"NABAVNACENA" NUMERIC(15,4) NOT NULL,
"PRODCENABP" NUMERIC(15,4) NOT NULL,
"KOREKCIJA" DOUBLE PRECISION,
"PRODAJNACENA" NUMERIC(15,2) NOT NULL,
"DEVIZNACENA" NUMERIC(15,4) NOT NULL,
"DEVPRODCENA" NUMERIC(15,4),
"KOLICINA" NUMERIC(15,3) NOT NULL,
"NIVKOL" NUMERIC(15,3) NOT NULL,
"TARIFAID" VARCHAR(3),
"IMAPOREZ" SMALLINT,
"POREZ" NUMERIC(15,2) NOT NULL,
"RABAT" NUMERIC(15,2) NOT NULL,
"MARZA" NUMERIC(15,2) NOT NULL,
"TAKSA" NUMERIC(15,4),
"AKCIZA" NUMERIC(15,2),
"PROSNAB" NUMERIC(15,4) NOT NULL,
"PRECENA" NUMERIC(15,4) NOT NULL,
"PRENAB" NUMERIC(15,4) NOT NULL,
"PROSPROD" NUMERIC(15,4) NOT NULL,
"MTID" VARCHAR(10),
"PT" CHAR(1) NOT NULL,
"ZVEZDICA" VARCHAR(6),
"TREN_STANJE" NUMERIC(15,3),
"POREZ_ULAZ" NUMERIC(15,2) NOT NULL,
"SDATUM" DATE,
"DEVNABCENA" NUMERIC(15,4),
"POREZ_IZ" NUMERIC(15,2) NOT NULL,
"X4" NUMERIC(15,3),
"Y4" NUMERIC(15,3),
"Z4" NUMERIC(15,3),
"CENAPOAJM" NUMERIC(15,2),
"KGID" INTEGER,
"SAKCIZA" NUMERIC(15,4) NOT NULL,
CONSTRAINT "STAVKAPRIMARYKEY" PRIMARY KEY ("STAVKAID")
);
我想导出数据,但是有 500k 行,我不知道它会在这里。
所以基本上STAVKA 是DOCUMENT_ITEM 在一些DOCUMENT 中
该项目包含ProductID (ROBAID)、Price (NABAVNACENA) 以及该文档中该产品的其他数据。
所以现在我想遍历所有STAVKA (DOCUMENT_ITEM) 并为每个ROBAID 选择最后一个Price (NABAVNACENA)。
对于单身,我设法这样做:
SELECT
t1.STAVKAID, s.ROBAID, s.NABAVNACENA
FROM
(SELECT FIRST 1 s.STAVKAID, d.DATUM
FROM DOKUMENT d
LEFT OUTER JOIN STAVKA s ON s.VRDOK = d.VRDOK AND s.BRDOK = d.BRDOK
WHERE d.VRDOK IN (0, 11, 18, 16, 22, 1, 2, 26, 29, 30)
AND d.DATUM >= '01.01.2021'
AND d.DATUM <= '31.12.2021'
AND s.ROBAID = 39
ORDER BY DATUM DESC) AS t1
LEFT OUTER JOIN
STAVKA s ON t1.STAVKAID = s.STAVKAID
它返回多行,但我按DATUM DESC 对它们进行排序并选择第一行,这样我就为ROBAID 选择了最后一个STAVKA
由于我有 4k ROBAID,我不想从我的代码中运行此查询 4k 次,而是将整个表返回给它
【问题讨论】:
-
您使用的是哪个 Firebird 版本?在任何情况下,当以这种方式使用
GROUP BY时,这个结果完全是预期的,因为包含NABAVNACENA将使它确定NABAVNACENA的每个不同值的最大日期。 -
2.1 版。不能再高了,不在我的能力范围内。
-
NABAVNACENA、ROBAID 和 DATUM 是否会有(最多)一行,或者 NABAVNACENA、ROBAID 是否可以有多行具有相同 DATUM?
-
@MarkRotteveel 可能有 0.001% 的可能性,但我不想把它包括在这个问题中,因为我脑子里有方向我会尝试用
limit 1或max/min来解决它像这样 -
你为什么在
S上做LEFT OUTER JOIN?看到s.NABAVNACENA, s.ROBAID是第一个、最有意义的专栏,甚至是群组制作,这看起来很奇怪?您打算如何处理其中一个或两个中有 NULL 的行?
标签: sql greatest-n-per-group firebird firebird2.1