SQL组和过滤器

时间:2014-09-08 16:47:38

标签: sql sql-server-2005

我意识到这就像SQL/mysql - Select distinct/UNIQUE but return all columns?一样,但我完全输了,而且总是那样,报告立即需要......

我想要(全部来自同一张桌子)

首先 - 唯一的AsbestosNumber

秒 - 基于上次调查日期

最后 - 基于那些过滤掉的结果获得最高风险(首先看看它有' A'然后' B'然后' C'那么' D'然后其他任何事情

select AsbestosUPRN, OverallRiskCategory, SurveyDate FROM TblAsbestos GROUP BY AsbestosUPRN, OverallRiskCategory, SurveyDate

但是也尝试了以下哪些不受约束的错误。

SELECT * FROM TblAsbestos  

JOIN (SELECT AsbestosUPRN, Max(OverallRiskCategory) FROM TblAsbestos) As Tbl2
On Tbl2.AsbestosUPRN = Tbl1.AsbestosUPRN   
ORDER BY  Tbl1.AsbestosUPRN 

然后,我需要修改报告,以便通过另一个表中的唯一编号进行搜索。

日期示例:

AsbestosUPRN SurveyDate OverallRiskCategory
011203200 2014-01-07 00:00:00.000 N/A
011203200 2014-01-07 00:00:00.000 N/A
011203200 2014-01-07 00:00:00.000 N/A
011203200 2014-01-07 00:00:00.000 C
011203200 2014-01-07 00:00:00.000 N/A
011203200 2014-01-07 00:00:00.000 N/A
030700630 2014-01-10 00:00:00.000 N/A
030700630 2014-01-10 00:00:00.000 N/A
030700620 2014-01-15 00:00:00.000 N/A
030700620 2014-01-15 00:00:00.000 N/A
030700620 2014-01-15 00:00:00.000 N/A
030700620 2014-01-15 00:00:00.000 N/A
030700620 2014-01-15 00:00:00.000 N/A
030700630 2014-01-10 00:00:00.000 N/A
030700630 2014-01-10 00:00:00.000 N/A

修正了工作代码:

select 
    AsbestosUPRN, 
    min(OverallRiskCategory) as OverallRiskCategory, 
    max(SurveyDate) as SurveyDate
FROM TblAsbestos 
GROUP BY 
    AsbestosUPRN

2 个答案:

答案 0 :(得分:1)

如果AsbestotosUPRN是唯一的,则它不能全部在一个表中。我假设你有以下表格:

UPRN    OverallRiskCategory   SurveyDate
   1                2           1/1/14
   1                5           1/2/14
   1                3           1/3/14
   2                7           1/1/14

你想得到这样的东西:

UPRN    OverallRiskCategory
   1                5      
   2                7

正确?

然后,您应该使用聚合函数:

SELECT UPRN, max(OverallRiskCategoy)
FROM Tbl
GROUP BY UPRN

答案 1 :(得分:1)

如果我正确理解您的问题,您希望UPRN具有UPRN的最新调查日期,该UPRN /日期组合的风险分类最高。如果这是您想要的,那么以下SQL代码应该可以工作。

WITH md AS (
    SELECT AsbestosUPRN, Max(SurveyDate) AS maxdate
    FROM TblAsbestos
    GROUP BY AsbestosUPRN
    )
SELECT md.AsbestosUPRN, maxdate, Max(overallriskcategory) AS maxrisk
FROM md, TblAsbestos t
WHERE md.AsbestosUPRN = t.AsbestosUPRN AND
    md.maxdate = t.surveydate
GROUP BY md.AsbestosUPRN, maxdate;

请注意,这仅适用于数据库中N / A数据实际为NULL的情况。否则max(overallriskcategory)将始终返回N / A'因为它是最高的'串。如果你需要转换'N / A'为NULL,以下内容应该有效:

UPDATE tblasbestos
SET overallriskcategory = NULL
WHERE overallriskcategory = 'N/A';