mysql 如何根据数据规范创建返回值的SQL代码

js81xvg6  于 2022-12-26  发布在  Mysql
关注(0)|答案(1)|浏览(111)

我在mysql中有一个结构如下的表

id        int pk
client    varchar
dateOne   date
descOne   float
material  varchar
dateTwo   date
descTwo   float

下面是表中数据的一些示例

client        dateOne descOne material  dateTwo   descTwo
1000009999  30.09.2020  60  Null        0
1000009999  18.08.2020  70  Null        0
1000009999  06.07.2018  50  Null        0
1000009999  30.09.2020  60  1000004 30.09.2020  60
1000009999  30.09.2020  60  1000004 17.11.2020  55
1000009999  30.09.2020  60  1000004 21.03.2022  60
1000009999  30.09.2020  60  1000004 19.04.2022  60
1000009999  30.09.2020  60  1000002 30.09.2020  60
1000009999  30.09.2020  60  1000002 17.11.2020  55
1000009999  30.09.2020  60  1000002 21.03.2022  60
1000009999  30.09.2020  60  1000002 19.04.2022  60
1000009999  30.09.2020  60  1000001 30.09.2020  60
1000009999  30.09.2020  60  1000001 17.11.2020  55
1000001163  30.09.2020  60  Null        0
1000001163  18.08.2020  70  Null        0
1000001163  06.07.2018  50  Null        0
1000001163  30.09.2020  60  1000004 30.09.2020  60
1000001163  30.09.2020  60  1000004 17.11.2020  55
1000001163  30.09.2020  60  1000004 21.03.2022  60
1000001163  30.09.2020  60  1000004 19.04.2022  60
1000001163  30.09.2020  60  1000002 30.09.2020  60
1000001163  30.09.2020  60  1000002 17.11.2020  55
1000001163  30.09.2020  60  1000002 21.03.2022  60
1000001163  30.09.2020  60  1000002 19.04.2022  60
1000001163  30.09.2020  60  1000001 30.09.2020  60
1000001163  30.09.2020  60  1000001 17.11.2020  55

我需要构建一个执行以下检查的SQL查询:
客户退货、物料退货;
如果填写了“material”字段,则根据“dateTwo”返回最近的“descTwo”
如果“material”字段为“null”,则根据“descOne”返回最近的“descOne "
以下是预期结果的示例:

client        dateOne descOne material  dateTwo   descTwo
1000009999  30.09.2020  60  Null        0
1000009999  30.09.2020  60  1000004 19.04.2022  60
1000009999  30.09.2020  60  1000002 19.04.2022  60
1000009999  30.09.2020  60  1000001 17.11.2020  55
1000001163  30.09.2020  60  Null        0
1000001163  30.09.2020  60  1000004 19.04.2022  60
1000001163  30.09.2020  60  1000002 19.04.2022  60
1000001163  30.09.2020  60  1000001 17.11.2020  55
xtfmy6hx

xtfmy6hx1#

Please Please Please使用ISO-8601日期表示法,例如YYYY-MM-DD,它使回答问题容易得多...
由于您提供了无效的日期,我使用字符串和STR_TO_DATE()编写了一个演示。

WITH
  prioritised AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (
      PARTITION BY client, material
          ORDER BY STR_TO_DATE(dateTwo, '%d.%m.%Y') DESC,
                   STR_TO_DATE(dateOne, '%d.%m.%Y') DESC
    )
      AS priority
  FROM
    example
)
SELECT
  *
FROM
  prioritised
WHERE
  priority = 1

演示:https://dbfiddle.uk/JyVlxebZ

相关问题