从连接返回一列第一列的第一个结果

时间:2017-08-09 16:28:57

标签: sql-server join group-by

我需要一些帮助来改进我的部分查询。查询返回正确的数据,我只需要排除一些我不需要的额外信息。

我相信会改变的主要部分之一是:

JOIN TBL_DATA_TYPE_RO_BODY TB ON TB.FK_ID_TBL_FILE_NAMES=VMI.ID_TBL_FILE_NAMES

在这部分中,我有2个FK_ID_TBL_FILE_NAMES,它将从TBL_DATA_TYPE_RO_BODY返回2个结果。

我拥有的数据是(我排除了一些额外的列):

  • 如果我有相同字段的2个或更多相等的MAG" ONLY_FIELD_NAME"我应该只返回第一个(我不关心其他人)。我相信这是Group by的一个简单案例,但我在加入时遇到了这个小组的麻烦。

我的想法:

  1. 使用select top(例如here
  2. 使用第一个valeu(即here
  3. 我有什么(注意最后两行):

    Freq|Mag|Phase|Date|ONLY_FILE_NAME
    1608039|767|3234|37:00.0|RO_Mass_Load_4b
    1608039|781|3371|44:00.0|RO_Mass_Load_4b
    1608039|788|3138|37:00.0|RO_Mass_Load_4b
    1608039|797|3326|44:00.0|RO_Mass_Load_4b
    1608039|808|3117|37:00.0|RO_Mass_Load_4b
    1608039|808|3269|44:00.0|RO_Mass_Load_4b
    

    我想要的是什么(请注意最后一行):

    Freq|Mag|Phase|Date|ONLY_FILE_NAME
    1608039|767|3234|37:00.0|RO_Mass_Load_4b
    1608039|781|3371|44:00.0|RO_Mass_Load_4b
    1608039|788|3138|37:00.0|RO_Mass_Load_4b
    1608039|797|3326|44:00.0|RO_Mass_Load_4b
    1608039|808|3117|37:00.0|RO_Mass_Load_4b
    

    请注意,mag字段来自我的JOIN。

    想法?有什么帮助吗?

    如果你想看到整个代码是:

    SELECT  TW.CURRENT_MEASUREMENT as Cycle_Current_Measurement, 
    TW.REF_MEASUREMENT as Cycle_Ref_Measurement, 
    CONVERT(REAL,TT.CURRENT_TEMP) as Cycle_Current_Temp, 
    CONVERT(REAL,TT.REF_TEMP) as Cycle_Ref_Temp, 
    TP.TYPE as Cycle_Type, TB.FREQUENCY as Freq, 
    TB.MAGNITUDE as Mag, 
    TB.PHASE as Phase, 
    VMI.TIME_FORMATTED as Date, 
    VMI.ID_TBL_FILE_NAMES as IdFileNames, VMI.ID_TBL_DATA_TYPE_RO_HEADER as IdHeader, VMI.*  
    FROM VW_MAIN_INFO VMI 
    JOIN TBL_DATA_TYPE_RO_BODY TB ON TB.FK_ID_TBL_FILE_NAMES=VMI.ID_TBL_FILE_NAMES
    LEFT JOIN TBL_POINTS_AND_CYCLES TP  ON VMI.ID_TBL_DATA_TYPE_RO_HEADER = TP.FK_ID_TBL_DATA_TYPE_RO_HEADER 
    LEFT JOIN TBL_POINTS_AND_MEASUREMENT TW  ON VMI.ID_TBL_DATA_TYPE_RO_HEADER = TW.FK_ID_TBL_DATA_TYPE_RO_HEADER 
    LEFT JOIN TBL_POINTS_AND_TEMP TT  ON VMI.ID_TBL_DATA_TYPE_RO_HEADER = TT.FK_ID_TBL_DATA_TYPE_RO_HEADER 
    

1 个答案:

答案 0 :(得分:0)

尝试这样的事情。 partition by就像group by;它定义了row_number将整数自动递增1的组。顺序告诉row_number哪些行应该具有较低的数字。因此,在此示例中,最低日期将具有RID = 1.然后对其进行子查询,并仅选择具有RID = 1

的行
select *
from (select RID = row_number() over (partition by tb.Magnitude order by vmi.time_formatted)
      from ...<rest of your query>) a
where a.RID = 1