【问题标题】:Returning from a join the first result of one column based one a second column从连接返回一个基于第二列的一列的第一个结果
【发布时间】:2018-01-17 15:56:04
【问题描述】:

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

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

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个结果。

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

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

我的想法:

  1. 使用顶部选择(即here
  2. 使用第一个值(即here

我有什么(注意最后两行):

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

请注意,磁场来自我的 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 

【问题讨论】:

    标签: sql-server join group-by


    【解决方案1】:

    试试这样的。 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-23
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      相关资源
      最近更新 更多