第一个查询的PostgreSQL结果用于第二个查询

时间:2020-02-11 12:50:28

标签: sql postgresql

样本数据:

|lastmodified|Number1|Number2|password_mod|
|2020-01-25  |250000 |100000 |true        |
|2020-01-26  |250000 |200000 |false       |
|2020-02-01  |300000 |200000 |false       |
|2020-02-10  |350000 |250000 |false       |
|2020-02-12  |400000 |250000 |false       |

我需要使用以下条件运行查询:

lastmodified within a month AND password_mod = false
Show Number 1 & 2 for all entries

到目前为止,这很容易,但现在出现了我卡住的部分:

additionally it must show the last Number 1 & 2 that is lower than the current entry

结果应如下所示:

|lastmodified|Number1|Number2|password_mod|Old_Number1|Old_Number2|
|2020-02-01  |300000 |200000 |false       |250000     |100000     |
|2020-02-10  |350000 |250000 |false       |300000     |200000     |
|2020-02-12  |400000 |250000 |false       |350000     |200000     |

我的主要问题是,old_numbers可能存在与我的条件不符的记录中(日期在一个月之内,password_mod = false)。 但是这两个标准是强制性的。

我进行了两个查询,同时执行了两个步骤。现在,我需要一种很好的方法来组合它们。

查询1:

SELECT
a.lastmodifiedat AS Aenderungs_Datum,
a.lastmodifiedby AS Aenderungs_User,
a.ntusername AS Betroffener_User,
a.anweisungshoehekv AS AnweisungshoeheKV,
a.anweisungshoehepflege AS AnweisungshoehePflege
FROM
t_benutzer_aud a 
WHERE
(passwort_mod = 'false'
AND (a.lastmodifiedat between '2020-02-01' AND '2020-02-29'))

Query2:

SELECT
b.ntusername AS Betroffener_User,
b.lastmodifiedat AS Aenderungs_Datum,
b.anweisungshoehekv AS AnweisungshoeheKV_alt,
b.anweisungshoehepflege AS Anweisungshoehepflege_alt
FROM
t_benutzer_aud b
WHERE 
b.lastmodifiedat < '2020-02-01'
AND
passwort_mod = 'false'
AND b.ntusername = USERNAME from first query
ORDER BY
aenderungs_datum DESC LIMIT 1

1 个答案:

答案 0 :(得分:1)

编写查询的一种直观/用户可读的方式是使用CTE:

WITH userlist AS (
  SELECT
    a.lastmodifiedat AS Aenderungs_Datum,
    a.lastmodifiedby AS Aenderungs_User,
    a.ntusername AS Betroffener_User,
    a.anweisungshoehekv AS AnweisungshoeheKV,
    a.anweisungshoehepflege AS AnweisungshoehePflege
  FROM
    t_benutzer_aud a 
  WHERE
    (passwort_mod = 'false'
    AND (a.lastmodifiedat between '2020-02-01' AND '2020-02-29'))
) SELECT
    b.ntusername AS Betroffener_User,
    b.lastmodifiedat AS Aenderungs_Datum,
    b.anweisungshoehekv AS AnweisungshoeheKV_alt,
    b.anweisungshoehepflege AS Anweisungshoehepflege_alt
  FROM
    t_benutzer_aud b
  WHERE 
    b.lastmodifiedat < '2020-02-01'
  AND passwort_mod = 'false'
  AND b.ntusername = userlist.Betroffener_User
  ORDER BY aenderungs_datum DESC LIMIT 1;

披露:我为EnterpriseDB (EDB)工作