SQL - Выбрать на одну запись меньше - PullRequest
0 голосов
/ 18 марта 2020

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

для, например,

Всего A равно 4, поэтому на выходе должно быть 3 A

Всего B равно 1, поэтому на выходе не должно быть B

Всего C равно 2, поэтому на выходе должно быть One C

Всего D равно 1, поэтому на выходе должно быть не имеет D

Всего F равно 3, поэтому на выходе должно быть 2 F

+------+
| Data |
+------+
| A    |
| A    |
| A    |
| A    |
| B    |
| C    |
| C    |
| D    |
| E    |
| F    |
| F    |
| F    |
+------+

Выход

+------+
| Data |
+------+
| A    |
| A    |
| A    |
| C    |
| F    |
| F    |
+------+

Ответы [ 3 ]

2 голосов
/ 18 марта 2020

Вы можете использовать row_number(); гораздо лучше, если у вас есть столбец заказа (я предполагал id):

select data
from (select data, row_number() over(partition by data order by id) rn from mytable) t
where rn > 1

Если у вас нет столбца заказа, то вы можете просто order by data.

1 голос
/ 18 марта 2020

Использование row_number():

select t.data
from (select t.*, row_number() over (partition by data order by data) as seq
      from table t
     ) t
where seq > 1;
0 голосов
/ 18 марта 2020

Используя функции analyti c:

WITH cte AS (
    SELECT Data, COUNT(*) OVER (PARTITION BY Data) cnt,
        ROW_NUMBER() OVER (PARTITION BY Data ORDER BY (SELECT NULL)) rn
    FROM yourTable
)

SELECT Data
FROM cte
WHERE rn < cnt;

В простых терминах Engli sh вышеупомянутый подход сохраняет любую запись, чей номер строки (на основе некоторого произвольного порядка) равен меньше чем общее количество записей в каждой Data группе. Это означает, что одна запись на группу будет исключена из набора результатов.

...