SQL查询以选择我的第一列常用的记录

SQL查询以选择我的第一列常用的记录,sql,sql-server,Sql,Sql Server,我有一张和上面一样的桌子。现在我想选择SEG_起点代码和SEG_终点代码 这是所有SEG_航空公司的共同点 我想要像这样的输出 SEG_AIRLINE SEG_ORIGIN_CODE SEG_DESTINATION_CODE G9 ALA DEL G9 ALA DAC G9

我有一张和上面一样的桌子。现在我想选择SEG_起点代码和SEG_终点代码 这是所有SEG_航空公司的共同点

我想要像这样的输出

    SEG_AIRLINE SEG_ORIGIN_CODE SEG_DESTINATION_CODE
    G9              ALA             DEL                         
    G9              ALA             DAC             
    G9              BKK             OOL                 
    SG              IXA             MAA         
    SG              BKK             OOL     
    SG              IXA             GAU         
    6E              IXA             AMD
    6E              BKK             OOL
    6E              IXA             DEL
    AK              BKK             MEL
    AK              BKK             OOL
    AK              BKK             PER
我尝试了这个问题

    SEG_AIRLINE SEG_ORIGIN_CODE SEG_DESTINATION_CODE                                
    G9              BKK             OOL                         
    SG              BKK             OOL                 
    6E              BKK             OOL
    AK              BKK             OOL
我试过的另一个解决办法

    SELECT SEG_AIRLINE ,SEG_ORIGIN_CODE ,SEG_DESTINATION_CODE 
    FROM T_N_SEGMENTS
    GROUP BY SEG_AIRLINE
    HAVING COUNT(DISTINCT SEG_ORIGIN_CODE) = (SELECT COUNT(DISTINCT SEG_ORIGIN_CODE) FROM T_N_SEGMENTS)

但我不会根据您的评论返回任何记录更新。这将为您提供最常见的
seg\u源代码、seg\u目标代码对的行

    declare @airlineCount int
    select @airlineCount = count(distinct seg_airline) from T_N_SEGMENTS

    select seg_airline, seg_origin_code, seg_destination_code from T_N_SEGMENTS
    where
    (Select count(distinct seg_airline) from T_N_SEGMENTS s where s.seg_origin_code = T_N_SEGMENTS.seg_origin_code) = @airlineCount
    and
    (Select count(distinct seg_airline) from T_N_SEGMENTS s where s.seg_destination_code = T_N_SEGMENTS.seg_destination_code) = @airlineCount
这里是演示


你可以这样做

SELECT seg_airline, seg_origin_code, seg_destination_code
  FROM
(
  SELECT seg_airline, seg_origin_code, seg_destination_code, 
         RANK() OVER (ORDER BY cnt DESC) rank
    FROM
  (
    SELECT seg_airline, seg_origin_code, seg_destination_code,
           COUNT(*) OVER (PARTITION BY seg_origin_code, seg_destination_code) cnt
      FROM t_n_segments
  ) q
) p
 WHERE rank = 1
或者使用窗口功能

SELECT s.seg_airline, s.seg_origin_code, s.seg_destination_code
  FROM
(
  SELECT seg_origin_code, seg_destination_code 
    FROM t_n_segments
   GROUP BY seg_origin_code,seg_destination_code
  HAVING COUNT(DISTINCT seg_airline) = 
  (
    SELECT COUNT(DISTINCT seg_airline)
      FROM t_n_segments
  )
) q JOIN t_n_segments s
    ON q.seg_origin_code = s.seg_origin_code
   AND q.seg_destination_code = s.seg_destination_code
输出:

SELECT seg_airline, seg_origin_code, seg_destination_code
  FROM
(
  SELECT seg_airline, seg_origin_code, seg_destination_code,
         COUNT(*) OVER (PARTITION BY seg_origin_code, seg_destination_code) cnt
    FROM t_n_segments
) q
 WHERE cnt = 
(
  SELECT COUNT(DISTINCT seg_airline)
    FROM t_n_segments
)
|SEG|U航空公司| SEG|U始发地| SEG|U目的地|代码| |-------------|-----------------|----------------------| |G9 | BKK | OOL| |SG | BKK | OOL| |6E | BKK | OOL| |AK | BKK | OOL|
这是演示

您想要X,但您尝试了什么?您使用的是什么RDBMS?谢谢。工作正常。但当任何一家航空公司与其他航空公司不匹配时,它会返回空结果。不客气。您能否在示例数据上显示这一点,最好在注释中单击此处的
buildschema
后更改我的SQLFIDLE并发布到新SQLFIDLE的链接。在你的要求中,你提到了所有赛格尤航空公司的共同要求。 | SEG_AIRLINE | SEG_ORIGIN_CODE | SEG_DESTINATION_CODE | |-------------|-----------------|----------------------| | G9 | BKK | OOL | | SG | BKK | OOL | | 6E | BKK | OOL | | AK | BKK | OOL |