即时尝试在Access中进行查询,从表中选择MAX日期,该日期小于表中特定其他记录的日期,我必须检查该记录是否存在。
我知道描述有点令人困惑,所以我将尝试用伪代码解释它:
If(Record exists where editing_type = "Notranja kontrola")
SELECT MAX(created_at) that is smaller than ( MIN(created_at) Where
editing_type = "Notranja kontrola")
WHERE editing_type = "Zajem"
如果edit_type =“Notranja kontrola”的记录不存在, 我不想选择约会。 我想返回NULL。如果是,我想选择edit_type =“Zajem”的最大日期,小于MIN(日期)WHERE editing_type =“Notranja kontrola”)
我提出的查询:
SELECT
spr.ob_id AS Obcina,
spr.ko,
'DA' AS Dodeljeno,
(
SELECT MAX(created_at)
FROM (
SELECT created_at
FROM spremljanje_uporabnik_zajem
WHERE created_at < (
SELECT MIN(created_at)
FROM spremljanje_uporabnik_zajem
WHERE editing_type = "Notranja kontrola" AND ko = spr.ko AND VAL(ko) BETWEEN 0 AND 9999
)
)
WHERE editing_type = "zajem" AND ko = spr.ko AND VAL(ko) BETWEEN 0 AND 9999
AND EXISTS (
SELECT 1
FROM spremljanje_uporabnik_zajem
WHERE editing_type = "Notranja kontrola" AND ko = spr.ko AND VAL(ko) BETWEEN 0 AND 9999
)
) AS [krneki],
(SELECT
.....
)
FROM spremljanje_uporabnik_zajem AS spr
WHERE VAL(ko) BETWEEN 0 AND 9999
GROUP BY spr.ob_id, spr.ko
ORDER BY Val(spr.ko);
WHERE VAL(ko) BETWEEN 0 AND 9999
部分仅用于检查条目是否有效。
当我尝试运行查询时,我得到一个提示,要求我输入spr.ko,而不是将其作为外部查询的值。我该如何解决?
外部查询是存在的,因为我还需要选择其他一些东西。
编辑+编辑2:我只从表“tracking_user_users”中选择
样本数据:
ob_id ko editing_type created_at
40 100 zajem 1.01.2018
40 100 zajem 2.01.2018
40 100 notranja kontrola 3.01.2018
40 100 zajem 4.01.2018
90 550 zajem 2.01.2018
40 100 zajem 6.01.2018
40 20 zajem 7.01.2018
40 20 zajem 8.01.2018
40 20 notranja kontrola 9.01.2018
40 20 zajem 10.01.2018
40 100 zajem 11.01.2018
40 20 zajem 12.01.2018
40 20 notranja kontrola 13.01.2018
40 100 notranja kontrola 13.01.2018
Expected REXPECTED RESULT:
ob_id ko Dodeljeno krneki
40 100 DA 2.01.2018
90 550 DA NULL
40 20 DA 8.01.2018
谢谢
MIN(date)
MIN(date)
之前的日期的行MAX(CASE)
,您可以使用空值删除日期。WITH cte as (
SELECT "ob_id", "ko", MIN("created_at") min_kontrola
FROM Table1
WHERE "editing_type" = 'notranja kontrola'
GROUP BY "ob_id", "ko"
)
SELECT t."ob_id",
t."ko",
MAX(CASE WHEN c.min_kontrola IS NOT NULL
THEN t."created_at"
END) as krneki
FROM Table1 t
LEFT JOIN cte c
ON t."ob_id" = c."ob_id"
AND t."ko" = c."ko"
AND t."created_at" < c.min_kontrola
GROUP BY t."ob_id", t."ko"
ORDER BY t."ob_id", t."ko";
OUTPUT
| ob_id | ko | max |
|-------|-----|------------|
| 40 | 20 | 2018-01-08 |
| 40 | 100 | 2018-01-02 |
| 90 | 550 | (null) |
在SQL DEMO中,您有两个查询。第二个我删除GROUP BY
所以你可以在最后一步之前看到结果。
也许你可以接受这个查询并自己完成剩下的工作。
select
t3.ob_id,
t3.ko,
t4.max_created_at
from(
select distinct
ob_id,
ko
from dummyTable
) t3
left join (
SELECT
t1.ob_id,
t1.ko,
max(t1.created_at) max_created_at
from dummyTable t1
where exists (
select
1
from dummyTable t2
where t2.ob_id = t1.ob_id and
t2.ko = t1.ko and
t2.editing_type = 'nontranja kontrola' and
t1.created_at < t2.created_at
)) t4
on t4.ob_id = t3.ob_id and
t4.ko = t3.ko
你可以尝试here。
解决方案,万一有人感兴趣(从@Juan Carlos Oropeza帖子修改 - 用子查询替换CTE并使用MS Access语法)
SELECT
t.ob_id,
t.ko,
MAX(iif(c.min_kontrola IS NOT NULL,t.created_at)) as krneki,
FROM spremljanje_uporabnik_zajem t
LEFT JOIN
(
SELECT ob_id, ko, MIN(created_at) AS min_kontrola
FROM spremljanje_uporabnik_zajem
WHERE editing_type = 'notranja kontrola'
GROUP BY ob_id, ko
)AS c
ON (t.ob_id = c.ob_id
AND t.ko = c.ko
AND (t.created_at < c.min_kontrola)
AND VAL(t.ko) BETWEEN 0 AND 9999
AND t.editing_type = "zajem"
)
GROUP BY t.ob_id, t.ko
ORDER BY t.ob_id, t.ko;
在理解了“NULL要求”之后,我不得不修改我的答案。您的查询不是太糟糕,但我找到了一些改进/纠正的方法:
MIN
也不存在,因此与任何“zajem记录”的比较将失败,这将导致所需的“无最大值”(NULL)。从中得出的结论如下:
SELECT
spr.ob_id AS Obcina
, spr.ko
, 'DA' AS Dodeljeno
, (
SELECT MAX(created_at)
FROM spremljanje_uporabnik_zajem
WHERE editing_type = "zajem" AND ko = spr.ko AND VAL(ko) BETWEEN 0 AND 9999
AND created_at < (
SELECT MIN(created_at)
FROM spremljanje_uporabnik_zajem
WHERE editing_type = "Notranja kontrola" AND ko = spr.ko AND VAL(ko) BETWEEN 0 AND 9999
)
) AS [krneki]
FROM spremljanje_uporabnik_zajem AS spr
WHERE VAL(ko) BETWEEN 0 AND 9999
GROUP BY spr.ob_id, spr.ko
ORDER BY VAL(spr.ko);
Access可以在没有任何打嗝的情况下运行它: