Home » Identify FIFA father-son pairs by

Identify FIFA father-son pairs by

— This is the second last problem in the series of FIFA world cup challenges — Identify the father son duo from the data set of FIFA World cups (some data changed). Following are the criteria 1. Both should belong to same country 2. Surname i.e. last name should be same 3. Minimum difference in years will be 16

📌 Challenge Details and Links
ExcelBI Power Query Challenge Number: 31
Challenge Difficulty: ⭐️⭐️⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Identify FIFA father-son pairs by with Power Query

Power Query solution 1 for Identify FIFA father-son pairs by, proposed by Luan Rodrigues:
let
  Fonte = Data, 
  a = Table.AddColumn(Fonte, "Personalizar", each List.Last(Text.Split([Name], " "))), 
  b = Table.AddColumn(a, "Personalizar.1", each a[Name]), 
  c = Table.ExpandListColumn(
    Table.AddColumn(
      b, 
      "Personalizar.2", 
      each List.Distinct(List.FindText([Personalizar.1], [Personalizar]))
    ), 
    "Personalizar.2"
  ), 
  d = Table.NestedJoin(
    a, 
    {"Name"}, 
    c, 
    {"Personalizar.2"}, 
    "Personalizar.2 Expandido", 
    JoinKind.LeftOuter
  ), 
  e = Table.ExpandTableColumn(
    d, 
    "Personalizar.2 Expandido", 
    {"Country", "Name", "Year"}, 
    {"Country.1", "Father", "Year.1"}
  ), 
  Result = Table.Sort(
    Table.RenameColumns(
      Table.SelectRows(
        Table.AddColumn(
          e, 
          "Personalizar.3", 
          each 
            if [Name] <> [Father] and [Country] = [Country.1] and ([Year] - [Year.1]) > 15 then
              true
            else
              false
        ), 
        each ([Personalizar.3] = true)
      ), 
      {{"Name", "Son"}}
    ), 
    {{"Country", Order.Ascending}}
  )[[Father], [Son], [Country]]
in
  Result
Power Query solution 2 for Identify FIFA father-son pairs by, proposed by Bhavya Gupta:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  InsertedSurname = Table.AddColumn(
    Source, 
    "Surname", 
    each Text.AfterDelimiter([Name], " ", {0, RelativePosition.FromEnd}), 
    type text
  ), 
  FnTbl = (tbl as table) =>
    let
      C_1 = List.Min(tbl[Year]), 
      C_2 = List.Distinct(tbl[Country]), 
      C_3 = List.Select(
        List.Transform(
          List.Sort(Table.ToRows(tbl), each _{1}), 
          each 
            let
              a = (_{1} - C_1)
            in
              if a > 15 then {_{0}} else if a = 0 then {_{0}} else {}
        ), 
        each _ <> {}
      ), 
      C_4 = List.Transform(List.Skip(C_3), each List.First(C_3) & _ & C_2), 
      C_5 = Table.FromRows(C_4, {"Father", "Son", "Country"})
    in
      C_5, 
  Grouped = Table.Group(
    InsertedSurname, 
    {"Country", "Surname"}, 
    {{"FnInvoked", each FnTbl([[Name], [Year], [Country]])}}
  ), 
  RemoveEmptyTables = Table.Combine(List.Select(Grouped[FnInvoked], each not Table.IsEmpty(_))), 
  ExpectedOutput = Table.Sort(
    RemoveEmptyTables, 
    {{"Country", Order.Ascending}, {"Son", Order.Ascending}}
  )
in
  ExpectedOutput
Power Query solution 3 for Identify FIFA father-son pairs by, proposed by 🇮🇷 Navid Esmaeilzadeh اسماعیل زاده:
Part3:
 #"Filtered Rows2" = Table.SelectRows(#"Grouped Rows1", each [Count] >= 2),
 #"Removed Other Columns2" = Table.SelectColumns(#"Filtered Rows2",{"All"}),
 #"Expanded All" = Table.ExpandTableColumn(#"Removed Other Columns2", "All", {"Country", "Index1", "Name"}, {"Country", "Index1", "Name"}),
 #"Added Conditional Column" = Table.AddColumn(#"Expanded All", "Custom", each if [Index1] = 1 then "Father" else "Son"),
 #"Pivoted Column" = Table.Pivot(#"Added Conditional Column", List.Distinct(#"Added Conditional Column"[Custom]), "Custom", "Name"),
 #"Filled Down" = Table.FillDown(#"Pivoted Column",{"Father"}),
 #"Filled Up" = Table.FillUp(#"Filled Down",{"Son"}),
 #"Removed Other Columns3" = Table.SelectColumns(#"Filled Up",{"Country", "Father", "Son"}),
 #"Removed Duplicates" = Table.Distinct(#"Removed Other Columns3"),
 #"Reordered Columns" = Table.ReorderColumns(#"Removed Duplicates",{"Father", "Son", "Country"})
in
 #"Reordered Columns"
                    
                  
Power Query solution 4 for Identify FIFA father-son pairs by, proposed by 🇮🇷 Navid Esmaeilzadeh اسماعیل زاده:
Part2:
#"Filtered Rows" = Table.SelectRows(#"Grouped Rows", each [Count] >= 2),
 #"Removed Other Columns" = Table.SelectColumns(#"Filtered Rows",{"All", "MinYear"}),
 #"Added Custom" = Table.AddColumn(#"Removed Other Columns", "Custom", each Table.AddIndexColumn([All],"Index1",1,1)),
 #"Removed Other Columns1" = Table.SelectColumns(#"Added Custom",{"Custom", "MinYear"}),
 #"Inserted Subtraction" = Table.AddColumn(#"Expanded Custom", "Subtraction", each [Year] - [MinYear], type number),
 #"Filtered Rows1" = Table.SelectRows(#"Inserted Subtraction", each [Subtraction] = 0 or [Subtraction] >= 16),
 
                    
                  
Power Query solution 5 for Identify FIFA father-son pairs by, proposed by 🇮🇷 Navid Esmaeilzadeh اسماعیل زاده:
let
 Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
 #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Country", type text}, {"Year", Int64.Type}}),
 #"Split Column by Delimiter" = Table.SplitColumn(#"Changed Type", "Name", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, false), {"Name.1", "Name.2"}),
 #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Name.1", type text}, {"Name.2", type text}}),
 #"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"Name.1", "First Name"}, {"Name.2", "Last Name"}}),
 #"Sorted Rows" = Table.Sort(#"Renamed Columns",{{"Last Name", Order.Ascending}, {"Year", Order.Ascending}}),
 #"Added Index" = Table.AddIndexColumn(#"Sorted Rows", "Index", 1, 1, Int64.Type),
 #"Renamed Columns1" = Table.RenameColumns(#"Added Index",{{"Index", "Index."}}),
 #"Grouped Rows" = Table.Group(#"Renamed Columns1", {"Last Name", "Country"}, {{"Count", each Table.RowCount(_), Int64.Type}, {"All", each _, type table [First Name=nullable text, Last Name=nullable text, Country=nullable text, Year=nullable number, #"Index."=number]}, {"MinYear", each List.Min([Year]), type nullable number}}),
 


                    
                  
          
Power Query solution 6 for Identify FIFA father-son pairs by, proposed by Matthias Friedmann:
let
  Source = Excel.CurrentWorkbook(){[Name = "WCfatherSon"]}[Content], 
  Surname = Table.AddColumn(Source, "Surname", each Text.AfterDelimiter([Name], " ")), 
  One = Table.AddColumn(Surname, "Custom", each 1), 
  Merged = Table.NestedJoin(One, {"Custom"}, One, {"Custom"}, "Added Custom", JoinKind.LeftOuter), 
  Expanded = Table.ExpandTableColumn(
    Merged, 
    "Added Custom", 
    {"Name", "Country", "Year", "Surname"}, 
    {"Son?", "Country.1", "Year.1", "Surname.1"}
  ), 
  Filtered = Table.SelectRows(
    Expanded, 
    each [Country] = [Country.1] and [Surname] = [Surname.1] and [Year.1] - [Year] > 15
  )[[Country], [Name], [#"Son?"]]
in
  Filtered
Power Query solution 7 for Identify FIFA father-son pairs by, proposed by Matthias Friedmann:
let
  Source = Excel.CurrentWorkbook(){[Name = "WCfatherSon"]}[Content], 
  Surname = Table.AddColumn(Source, "Surname", each Text.AfterDelimiter([Name], " ")), 
  #"Grouped Rows" = Table.Group(
    Surname, 
    {"Country", "Surname"}, 
    {
      {
        "All", 
        each 
          let
            table = Table.AddColumn([[Country], [Name], [Year]], "Custom", each 1), 
            merged = Table.NestedJoin(
              table, 
              {"Custom"}, 
              table, 
              {"Custom"}, 
              "joint", 
              JoinKind.LeftOuter
            ), 
            expanded = Table.ExpandTableColumn(
              merged, 
              "joint", 
              {"Name", "Year"}, 
              {"Son?", "Year.1"}
            ), 
            filtered = Table.SelectRows(
              expanded, 
              each ([Name] <> [#"Son?"] and [Year.1] - [Year] > 15)
            )[[Country], [Name], [#"Son?"]]
          in
            filtered, 
        type table
      }
    }
  ), 
  Combined = Table.Combine(#"Grouped Rows"[All])
in
  Combined
Power Query solution 8 for Identify FIFA father-son pairs by, proposed by Victor Wang:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  ToRecs = Table.ToRecords(Source), 
  GetPairs = List.Select(
    List.Transform(
      ToRecs, 
      each Table.FromRecords(
        {_}
          & List.Select(
            ToRecs, 
            (a) =>
              [Country]
                = a[Country] and Number.Abs([Year] - a[Year])
                >= 16
                  and Text.AfterDelimiter([Name], " ")
                  = Text.AfterDelimiter(a[Name], " ") and a
                  <> _
          )
      )
    ), 
    each Table.RowCount(_) > 1
  ), 
  Finish = Table.FromRecords(
    List.Distinct(
      List.Sort(
        List.Transform(
          GetPairs, 
          each [
            Father  = Table.Min(_, "Year")[Name], 
            Son     = Table.Max(_, "Year")[Name], 
            Country = _{0}[Country]
          ]
        ), 
        each [Country]
      )
    )
  )
in
  Finish
Power Query solution 9 for Identify FIFA father-son pairs by, proposed by Venkata Rajesh:
let
  Source = Data, 
  Surname = Table.AddColumn(Source, "Surname", each List.Last(Text.Split([Name], " ")), Text.Type), 
  Sorted = Table.Sort(Surname, {{"Country", Order.Ascending}, {"Year", Order.Ascending}}), 
  Grouped = Table.Group(
    Sorted, 
    {"Country", "Surname"}, 
    {
      {"All", each _, type table [Name = nullable text, Year = nullable Int64.Type]}, 
      {"FatherYear", each List.Min([Year]), type nullable Int64.Type}, 
      {"Father", each List.First([Name]), type nullable text}
    }
  ), 
  Expanded = Table.ExpandTableColumn(Grouped, "All", {"Name", "Year"}, {"Son", "Year"}), 
  Filtered = Table.SelectRows(Expanded, each [Year] - [FatherYear] >= 16)[
    [Father], 
    [Son], 
    [Country]
  ]
in
  Filtered
Power Query solution 10 for Identify FIFA father-son pairs by, proposed by Sandeep Marwal:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Surname = Table.AddColumn(
    Source, 
    "Surname", 
    each Text.AfterDelimiter([Name], " ", {0, RelativePosition.FromEnd}), 
    type text
  ), 
  #"Grouped Rows" = Table.Group(
    Surname, 
    {"Country", "Surname"}, 
    {
      {
        "Detail", 
        (t) =>
          [
            #"Added Custom" = Table.AddColumn(t, "Custom", each t), 
            #"Expanded Custom" = Table.ExpandTableColumn(
              #"Added Custom", 
              "Custom", 
              {"Name", "Year"}, 
              {"Name.1", "Year.1"}
            ), 
            #"Inserted Subtraction" = Table.AddColumn(
              #"Expanded Custom", 
              "Subtraction", 
              each [Year] - [Year.1], 
              type number
            ), 
            #"Filtered Rows" = Table.SelectRows(#"Inserted Subtraction", each [Subtraction] <= - 16), 
            #"Removed Other Columns" = Table.SelectColumns(
              #"Filtered Rows", 
              {"Name", "Name.1", "Country"}
            )
          ][#"Removed Other Columns"]
      }
    }
  ), 
  Custom1 = Table.Combine(#"Grouped Rows"[Detail])
in
  Custom1

Solving the challenge of Identify FIFA father-son pairs by with Excel

Excel solution 1 for Identify FIFA father-son pairs by, proposed by محمد حلمي:
=LET(r,
    REDUCE({0,
    0},
    C2:C37,
    LAMBDA(a,
    c,
    LET(
b,
    @+c:B37,
    x,
    @+c:A37,
    y,
    B2:B37,
    w,
    A2:A37,
    
i,
    (y=b)*(C2:C37-c>15)*
(TEXTAFTER(
    w,
    " ",
    -1
)=TEXTAFTER(
    x,
    " ",
    -1
)),
    
VSTACK(
    a,
    IFNA(
        HSTACK(
            x,
            FILTER(
                w,
                i,
                0
            ),
            FILTER(
                y,
                i,
                0
            )
        ),
        x
    )
)))),
    
SORT(
    FILTER(
        r,
        INDEX(
            r,
            ,
            2
        )>""
    ),
    3
))
Excel solution 2 for Identify FIFA father-son pairs by, proposed by محمد حلمي:
=LET(
ss,
    SORT(
        A2:C37,
        3
    ),
    
b,
    INDEX(
        ss,
        ,
        2
    ),
    
vv,
    REDUCE(0,
    UNIQUE(
        b
    ),
    LAMBDA(a,
    d,
    VSTACK(a,
     LET(
v,
    FILTER(
        ss,
        b=d
    ),
    
o,
    TEXTAFTER(
        INDEX(
            v,
            ,
            1
        ),
        " ",
        -1
    ),
    
REDUCE(0,
    UNIQUE(
        o
    ),
    LAMBDA(qq,
    ww,
    VSTACK(qq,
    LET(
ee,
    FILTER(
        v,
        o=ww
    ),
    
rr,
    TAKE(
        ee,
        ,
        1
    ),
    
bb,
    TAKE(
        rr,
        1
    ),
    
dd,
    INDEX(
        ee,
        ,
        3
    ),
    
IF((DROP(
    dd,
    1
)-TAKE(
    dd,
    1
))>15,
    
IFNA(
    HSTACK(
        
        IFNA(
            HSTACK(
                bb,
                DROP(
        rr,
        1
    )
            ),
            bb
        ),
        d
    ),
    d
),
    NA()))))))))),
    
VSTACK(
    HSTACK(
        "Father",
        "Son",
        "Country"
    ),
    
    SORT(
        FILTER(
            vv,
            1-ISNA(
                INDEX(
                    vv,
                    ,
                    3
                )
            )
        ),
        3
    )
))
Excel solution 3 for Identify FIFA father-son pairs by, proposed by محمد حلمي:
=LET(
a,
    A2:A37,
    b,
    B2:B37,
    c,
    C2:C37,
    d,
    b&TEXTAFTER(
        a,
        " "
    ),
    
y,
    (c-TOROW(
        c
    ))>15,
    s,
    d=TOROW(
        d
    ),
    
f,
    LAMBDA(
        e,
        TOCOL(
            IF(
                y*s,
                e,
                NA()
            ),
            3
        )
    ),
    
SORT(
    HSTACK(
        f(
            TOROW(
                a
            )
        ),
        f(
                a
            ),
        f(
            b
        )
    ),
    3
))
Excel solution 4 for Identify FIFA father-son pairs by, proposed by 🇰🇷 Taeyong Shin:
=LET(n,
    A2:A37,
    c,
    B2:B37,
    y,
    C2:C37,
    t,
    TEXTAFTER(
        n,
        " "
    )&c,
    SORT(TEXTSPLIT(TEXTJOIN(1,
    ,
    REPT(TOROW(
        n
    )&0&n&0&c,
    (t=TOROW(
        t
    ))*((y-TOROW(
        y
    ))>=16))),
    0,
    1),
    3))
Excel solution 5 for Identify FIFA father-son pairs by, proposed by Aditya Kumar Darak 🇮🇳:
=LET(
 _d,
     A2:C37,
    
 _ln,
     TEXTAFTER(
         INDEX(
             _d,
              ,
              1
         ),
          " ",
          -1
     ),
    
 _rw,
     SEQUENCE(
         ROWS(
             _d
         )
     ),
    
 _calc,
     REDUCE(
 "",
    
 _rw,
    
 LAMBDA(a,
     b,
    
 LET(
 f,
     FILTER(
         _d,
          _ln = INDEX(
              _ln,
               b
          )
     ),
    
 r,
     FILTER(
 f,
    
 (INDEX(
     f,
      ,
      2
 ) = INDEX(
     _d,
      b,
      2
 )) *
 ((INDEX(
     f,
      ,
      3
 ) - INDEX(
     _d,
      b,
      3
 )) > 15)
 ),
    
 IFERROR(
     
      VSTACK(
          
           a,
          
           IFNA(
               HSTACK(
                   INDEX(
                       _d,
                        b,
                        1
                   ),
                    r
               ),
                INDEX(
                       _d,
                        b,
                        1
                   )
           )
           
      ),
     
      a
      
& )
 )
 )
 ),
    
 SORT(
     DROP(
         _calc,
          1,
          -1
     ),
      3
 )
)

Solving the challenge of Identify FIFA father-son pairs by with SQL

SQL solution 1 for Identify FIFA father-son pairs by, proposed by Zoran Milokanović:
SELECT
 DF.NAME AS FATHER
, DS.NAME AS SON
, DF.COUNTRY
FROM DATA DF
JOIN DATA DS ON SUBSTR(DF.NAME, INSTR(DF.NAME, ' ') + 1) = SUBSTR(DS.NAME, INSTR(DS.NAME, ' ') + 1)
 AND DF.COUNTRY = DS.COUNTRY
 AND DS.YEAR - DF.YEAR >= 16
ORDER BY
 3, 1, 2
                    
                  

&&

Leave a Reply