选择连接表上的最近日期
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
请查看图片以获得所需的结果。所需结果为黄色。
我尝试过MAX
、DISTINCT
、多个连接、MAX DISTINCT
、GROUP 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_NUMBER
和 PARTITION 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 表中的所有字段都显示为无效的字段名称它们不是,并且表名称是正确的。此行之后的所有字段都显示错误消息:“无法绑定多部分标识符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 部分找到错误的解决方案,我也会将您的问题标记为已回答。
【讨论】:
以上是关于选择连接表上的最近日期的主要内容,如果未能解决你的问题,请参考以下文章