选择连接表上的最近日期

Posted

技术标签:

【中文标题】选择连接表上的最近日期【英文标题】:Selecting the most recent date on a joined table 【发布时间】:2020-08-06 01:32:58 【问题描述】:

我不知道如何创建子查询以仅选择按值 sys_loc_code 分组的最新日期。两个表 E 和 R 在 sys_sample_code 上加入。我想要 sys_loc_code 字段的不同值。我希望这是 sample_date 字段中包含最新日期的行中的数据。

我目前的代码是:

SELECT E.sample_date, E.sys_loc_code, R.sys_sample_code, R.chemical_name, R.result_value, R.detect, R.LabSampType
FROM GMP.GMP_Sample_Results AS R
INNER JOIN GMP.GMP_Sample_Events AS E ON R.sys_sample_code = E.sys_sample_code
WHERE (R.chemical_name = N'Tetrachloroethene') and E.sample_date > '2016-01-01 00:00:00.000'
ORDER BY sys_loc_code, sample_date desc

请查看图片以获得所需的结果。所需结果为黄色。

我尝试过MAXDISTINCT、多个连接、MAX DISTINCTGROUP BY 和无数其他方法。有人可以建议我需要的代码以获得我想要的结果。非常感谢。

【问题讨论】:

您尝试过 SELECT TOP 1 [fields] 吗? (将 [fields] 替换为您的字段名称) 您的结果不显示列名。但是假设“CTM”结果是位置,为什么你不想要“CTM12D”的一行? 如果您可以避免使用图像,请改为使用格式化文本,以供将来参考,或者提供 DDL/DML 语句以创建示例数据。 @Dale K 为 CTM12D 选择的结果不在屏幕上。 sys-loc_code 是第 3 列,sys_sample_code 是第 4 列。下次我会更好地格式化表格。会很好地说明 DDL/DML 语句到底是什么。 我确实尝试过,但只得到了一条记录,即所有记录的最新 sample_date。我不知道如何为每个 sys_loc_code @The Grand J 获取最新的 same_date 【参考方案1】:

如果你使用 ROW_NUMBERPARTITION BY 想要唯一的列和 ORDER BY 你想要最近的列,然后只取行号为 1 的结果,你应该得到什么你想要的。

SELECT sample_date, sys_loc_code, sys_sample_code, chemical_name, result_value, detect, LabSampType
FROM (
    SELECT E.sample_date, E.sys_loc_code, R.sys_sample_code, R.chemical_name, R.result_value, R.detect, R.LabSampType
      , ROW_NUMBER() OVER (PARTITION BY E.sys_loc_code ORDER BY sample_date DESC) RN
    FROM GMP.GMP_Sample_Results AS R
    INNER JOIN GMP.GMP_Sample_Events AS E ON R.sys_sample_code = E.sys_sample_code
    WHERE (R.chemical_name = N'Tetrachloroethene') AND E.sample_date > '2016-01-01 00:00:00.000'
) X
WHERE RN = 1
ORDER BY sys_loc_code, sample_date DESC;

【讨论】:

我的代码有一些问题:第一行,GMP_Sample_Results 表中的所有字段都显示为无效的字段名称它们不是,并且表名称是正确的。此行之后的所有字段都显示错误消息:“无法绑定多部分标识符 ”ROW_NUMBER(:抛出错误:“附近的语法不正确”)预期 EXCEPT OR UNION 也出现错误“WHERE”:“不正确"WHERE" 附近的语法和 at: ') X': "") 附近的语法不正确 @Bonneroo 在我现在已修复的 row_number 列之前缺少逗号。我怀疑无效的列名是因为您没有从外部查询中删除别名?注意内部查询有E.sample_date,但外部查询只有sample_date【参考方案2】:

这是我用来得到我想要的结果的代码。

SELECT R.*, E.sample_date
FROM GMP.GMP_Sample_Results AS R
INNER JOIN GMP.GMP_Sample_Events AS E ON R.sys_sample_code = E.sys_sample_code
INNER JOIN (
    SELECT sys_loc_code, MAX(sample_date) AS MAX_DATE
    FROM GMP.GMP_Sample_Events
    GROUP BY sys_loc_code
) AS MD ON E.sys_loc_code = MD.sys_loc_code AND E.sample_date = MD.MAX_DATE
WHERE (R.chemical_name = 'Tetrachloroethene') AND (E.sample_date > '2016-01-01-00:00:00.000')  
ORDER BY E.sys_loc_code

我对 TOP 1 和 PARTITION 解决方案也很感兴趣,如果有人愿意解释我如何成功地让这些解决方案发挥作用的话。给猫剥皮的方法总是不止一种。作为初学者,我的记忆盒中的工具越多,我的工作就会越好。感谢迄今为止提供的所有帮助。 @Dale K,如果您能在 cmets 部分找到错误的解决方案,我也会将您的问题标记为已回答。

【讨论】:

以上是关于选择连接表上的最近日期的主要内容,如果未能解决你的问题,请参考以下文章

对于表中的每一行,选择另一个表中由值连接的最近日期

SQL - 选择某个日期不存在的用户

有很多行的表上的基本选择非常慢

选择并取消链接 3 个表上的文件

超大表上的 MySQL 数据库性能选择

链表上的冒泡选择排序算法