Как я могу использовать MIN на столбце объединения SQL - PullRequest
0 голосов
/ 26 сентября 2018

У меня проблемы с использованием функции MIN в SQL.Я хочу получить список всех строк с минимальным значением из моей функции подсчета.

Вот мой код:

SELECT land, MIN(count) as lowest 
FROM 
 (
   SELECT temp.land, count(*) 
   FROM 
    (
      SELECT grans.land FROM Grans
      UNION ALL
      SELECT grans.aland FROM Grans
    ) as temp
   GROUP BY land
   ORDER BY land
 )  as subQuery
GROUP BY land
ORDER BY land

В данный момент я просто получаю таблицу с указанием земли иколичество, хотя количество переименовано в самое низкое.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Я бы использовал оконные функции:

SELECT land, cnt
FROM (SELECT temp.land, count(*) as cnt,
             MIN(count(*)) OVER () as min_cnt
      FROM (SELECT grans.land FROM Grans
            UNION ALL
            SELECT grans.aland FROM Grans
           ) temp
      GROUP BY land
     ) l
WHERE cnt = min_cnt;
0 голосов
/ 26 сентября 2018

удалить группу, если вы просто хотите min, потому что, если вы поставите группу, она вернет все количество земель, которое вы получили в вашем подзапросе, так как при подсчете это уже созданная группа, и это отличается

SELECT * 
FROM 
 (
   SELECT temp.land, count(*) as cnt
   FROM 
    (
      SELECT grans.land FROM Grans
      UNION ALL
      SELECT grans.aland FROM Grans
    ) as temp
   GROUP BY land
   ORDER BY land
 )  as subQuery

order by cnt asc
Limit 1

другой способ -

SELECT temp.land, count(*) as cnt
       FROM 
        (
          SELECT grans.land FROM Grans
          UNION ALL
          SELECT grans.aland FROM Grans
        ) as temp
       GROUP BY land
       having cnt in(

    SELECT min(cnt)
        FROM 
         (
           SELECT temp.land, count(*) as cnt
           FROM 
            (
              SELECT grans.land FROM Grans
              UNION ALL
              SELECT grans.aland FROM Grans
            ) as temp
           GROUP BY land
           ORDER BY land
         )  as subQuery
       )

, и он также работает

select * from
(
 SELECT * ,row_number() over(partition by land order by cnt) as rn 
    FROM 
     (
       SELECT temp.land, count(*) as cnt
       FROM 
        (
          SELECT grans.land FROM Grans
          UNION ALL
          SELECT grans.aland FROM Grans
        ) as temp
       GROUP BY land
       ORDER BY land
     )  as subQuery
 ) t where t.rn=1
...