SQL упорядочение городов по возрастанию и лиц по убыванию - PullRequest
0 голосов
/ 16 апреля 2020

Я застрял в сложной проблеме. Я не знаю версию этого SQL, это школьное издание. Но в любом случае это не релевантная информация.

Я хочу заказать города по возрастанию и номера по убыванию. С убывающими числами я подразумеваю, когда есть один и тот же город пару раз, он сначала заказывает наибольшее число.

Мне также нужны номера строк, я пробовал SELECT ROW_NUMBER() OVER(ORDER BY COUNT(FIRST_NAME)) row без успеха.

У меня есть две таблицы с именами CUSTOMERS и EMPLOYEES. У них обоих есть FIRST_NAME, LAST_NAME, CITY.

Теперь у меня есть такой код:

SELECT 
CITY, COUNT(FIRST_NAME),
CASE WHEN COUNT(FIRST_NAME) >= 0 THEN 'CUSTOMERS'
END
FROM CUSTOMERS
GROUP BY CITY

UNION

SELECT 
CITY, COUNT(FIRST_NAME),
CASE WHEN COUNT(FIRST_NAME) >= 0 THEN 'EMPLOYEES'
END
FROM EMPLOYEES
GROUP BY CITY

Этот SQL код дает мне такой список:

CITY
NEW YORK    2   CUSTOMERS
MIAMI       1   CUSTOMERS
MIAMI       4   EMPLOYEES
LOS ANGELES 1   CUSTOMERS
CHIGACO     1   CUSTOMERS
HOUSTON     1   CUSTOMERS
DALLAS      2   CUSTOMERS
SAN JOSE    2   CUSTOMERS
SEATTLE     2   CUSTOMERS
SEATTLE     5   EMPLOYEES
BOSTON      1   CUSTOMERS
BOSTON      3   EMPLOYEES

Я хочу, чтобы это выглядело так:

ROW  CITY
1    NEW YORK    2  CUSTOMERS
2    MIAMI       4  EMPLOYEES
3    MIAMI       1  CUSTOMERS
4    LOS ANGELES 1  CUSTOMERS
5    CHIGACO     1  CUSTOMERS
6    HOUSTON     1  CUSTOMERS
7    DALLAS      2  CUSTOMERS
8    SAN JOSE    2  CUSTOMERS
9    SEATTLE     5  EMPLOYEES
10   SEATTLE     2  CUSTOMERS
11   BOSTON      3  EMPLOYEES
12   BOSTON      1  CUSTOMERS

1 Ответ

1 голос
/ 16 апреля 2020

Вы можете использовать оконные функции в ORDER BY:

SELECT c.*
FROM ((SELECT CITY, COUNT(*) as cnt, 'CUSTOMERS' as WHICH
       FROM CUSTOMERS
       GROUP BY CITY
      ) UNION ALL
      (SELECT CITY, COUNT(*), 'EMPLOYEES'
       FROM EMPLOYEES
       GROUP BY CITY
      )
     ) c
ORDER BY MAX(cnt) OVER (PARTITION BY city) DESC,
         city,
         cnt DESC;
...