Як я можу виділити рядки зі MAX (значення стовпця), DISTINCT іншим стовпцем у SQL?


767

Мій стіл:

id  home  datetime     player   resource
---|-----|------------|--------|---------
1  | 10  | 04/03/2009 | john   | 399 
2  | 11  | 04/03/2009 | juliet | 244
5  | 12  | 04/03/2009 | borat  | 555
3  | 10  | 03/03/2009 | john   | 300
4  | 11  | 03/03/2009 | juliet | 200
6  | 12  | 03/03/2009 | borat  | 500
7  | 13  | 24/12/2008 | borat  | 600
8  | 13  | 01/01/2009 | borat  | 700

Мені потрібно вибрати кожне окреме, homeутримуючи максимальне значення datetime.

Результатом буде:

id  home  datetime     player   resource 
---|-----|------------|--------|---------
1  | 10  | 04/03/2009 | john   | 399
2  | 11  | 04/03/2009 | juliet | 244
5  | 12  | 04/03/2009 | borat  | 555
8  | 13  | 01/01/2009 | borat  | 700

Я намагався:

-- 1 ..by the MySQL manual: 

SELECT DISTINCT
  home,
  id,
  datetime AS dt,
  player,
  resource
FROM topten t1
WHERE datetime = (SELECT
  MAX(t2.datetime)
FROM topten t2
GROUP BY home)
GROUP BY datetime
ORDER BY datetime DESC

Не працює. Набір результатів має 130 рядків, хоча база даних містить 187. Результат включає деякі дублікати home.

-- 2 ..join

SELECT
  s1.id,
  s1.home,
  s1.datetime,
  s1.player,
  s1.resource
FROM topten s1
JOIN (SELECT
  id,
  MAX(datetime) AS dt
FROM topten
GROUP BY id) AS s2
  ON s1.id = s2.id
ORDER BY datetime 

Ні. Дає всі записи.

-- 3 ..something exotic: 

З різними результатами.

Відповіді:


938

Ви такі близькі! Все, що вам потрібно зробити, - це вибрати ВІД будинку та його максимальний час побачення, а потім приєднатись до toptenтаблиці на полях ДІЯЛЬНО:

SELECT tt.*
FROM topten tt
INNER JOIN
    (SELECT home, MAX(datetime) AS MaxDateTime
    FROM topten
    GROUP BY home) groupedtt 
ON tt.home = groupedtt.home 
AND tt.datetime = groupedtt.MaxDateTime

5
Перевірте це, якщо два рівні максимум дати будуть в одному будинку (з різними гравцями)
Максим Гонтар

5
Я думаю, що класичний спосіб зробити це з природним приєднанням: "SELECT tt. * ОТ topten tt ПРИРОДНИЙ ПРИЄДНАЙТЕСЬ (SELECT home, MAX (datetime) AS datetime ОТ topten GROUP BY home) mostrecent;" Той самий запит, але, мабуть, читабельніший
Parker

31
що робити, якщо є два рядки, які мають однакові значення 'home' та 'datetime'?
Кемаль Дуран

3
@Young проблема з вашим запитом полягає в тому, що він може повернутися id, playerі resourceне макс-рядок для даного будинку, тобто для home = 10, ви можете отримати: 3 | 10 | 04/03/2009 | john | 300 Іншими словами, це не гарантує, що всі стовпці рядків у наборі результатів будуть належати до макс (дата) для даного будинку.
sactiw

1
@ me1111 Проблема з вашим запитом полягає в тому, що він може / не може повертати рядок s max (datetime) для даного будинку. Причина того, що "GROUP BY" отримає будь-який випадковий рядок для кожного будинку, і ЗАМОВЛЕННЯ BY просто сортуватиме загальний результат, отриманий групою GROUP BY
Сацив,

87

Найшвидше MySQLрішення, без внутрішніх запитів і без GROUP BY:

SELECT m.*                    -- get the row that contains the max value
FROM topten m                 -- "m" from "max"
    LEFT JOIN topten b        -- "b" from "bigger"
        ON m.home = b.home    -- match "max" row with "bigger" row by `home`
        AND m.datetime < b.datetime           -- want "bigger" than "max"
WHERE b.datetime IS NULL      -- keep only if there is no bigger than max

Пояснення :

Приєднайте таблицю до себе, використовуючи homeстовпець. Використання LEFT JOINгарантує, що всі рядки з таблиці mвідображаються в наборі результатів. Тим, у кого немає відповідності в таблиці, bбуде розміщено NULLs для стовпців b.

Інша умова JOINзапитів, щоб відповідати лише рядкам із bцього значення, має більше значення в datetimeстовпці, ніж рядок з m.

Використовуючи дані, розміщені у запитанні, LEFT JOINзаповіт створить ці пари:

+------------------------------------------+--------------------------------+
|              the row from `m`            |    the matching row from `b`   |
|------------------------------------------|--------------------------------|
| id  home  datetime     player   resource | id    home   datetime      ... |
|----|-----|------------|--------|---------|------|------|------------|-----|
| 1  | 10  | 04/03/2009 | john   | 399     | NULL | NULL | NULL       | ... | *
| 2  | 11  | 04/03/2009 | juliet | 244     | NULL | NULL | NULL       | ... | *
| 5  | 12  | 04/03/2009 | borat  | 555     | NULL | NULL | NULL       | ... | *
| 3  | 10  | 03/03/2009 | john   | 300     | 1    | 10   | 04/03/2009 | ... |
| 4  | 11  | 03/03/2009 | juliet | 200     | 2    | 11   | 04/03/2009 | ... |
| 6  | 12  | 03/03/2009 | borat  | 500     | 5    | 12   | 04/03/2009 | ... |
| 7  | 13  | 24/12/2008 | borat  | 600     | 8    | 13   | 01/01/2009 | ... |
| 8  | 13  | 01/01/2009 | borat  | 700     | NULL | NULL | NULL       | ... | *
+------------------------------------------+--------------------------------+

Нарешті, WHEREзастереження зберігає лише пари, які мають NULLs у стовпцях b(вони позначені *у таблиці вище); це означає, що через другу умову з JOINпункту, вибраний рядок mмає найбільше значення у стовпці datetime.

Прочитайте антивіруси SQL: уникнення підводних каменів програми програмування баз даних для інших порад щодо SQL.


З SQLite, перший набагато повільніше, ніж у версії La Voie, коли на зібраному стовпчику немає індексу (тобто "додому"). (Випробувано з 24-рядковими рядками, що призводить до 13-рядкових рядків)
Томас Темпельман

10
Це найкраща відповідь, якщо ви покажете план виконання, ви побачите цей крок менше на цей запит
TlmaK0

що станеться, якщо два ряди будуть однаковими homeі, datetimeа datetimeмаксимум - для цього конкретного home?
Істіак Ахмед

Обидва ряди відображаються в наборі результатів. Ця відповідь є доказом концепції. У вашому реальному коді, ймовірно, є інший критерій, щоб вибрати лише один із них у цій ситуації (можливо, перший чи останній, або ви використовуєте інший стовпець для вирішення). Просто додайте цей критерій як нову умову в ONпункті. Fe, ... ON ... AND m.id < b.idщоб зберегти найновіший запис (той, який має найбільше id), коли два ряди мають однакові значення у homeта datetimeстовпцях, і це максимальне значення datetime.
аксіак

Які індекси найкраще оптимізувати для такого запиту?
AjaxLeung

73

Ось версія T-SQL :

-- Test data
DECLARE @TestTable TABLE (id INT, home INT, date DATETIME, 
  player VARCHAR(20), resource INT)
INSERT INTO @TestTable
SELECT 1, 10, '2009-03-04', 'john', 399 UNION
SELECT 2, 11, '2009-03-04', 'juliet', 244 UNION
SELECT 5, 12, '2009-03-04', 'borat', 555 UNION
SELECT 3, 10, '2009-03-03', 'john', 300 UNION
SELECT 4, 11, '2009-03-03', 'juliet', 200 UNION
SELECT 6, 12, '2009-03-03', 'borat', 500 UNION
SELECT 7, 13, '2008-12-24', 'borat', 600 UNION
SELECT 8, 13, '2009-01-01', 'borat', 700

-- Answer
SELECT id, home, date, player, resource 
FROM (SELECT id, home, date, player, resource, 
    RANK() OVER (PARTITION BY home ORDER BY date DESC) N
    FROM @TestTable
)M WHERE N = 1

-- and if you really want only home with max date
SELECT T.id, T.home, T.date, T.player, T.resource 
    FROM @TestTable T
INNER JOIN 
(   SELECT TI.id, TI.home, TI.date, 
        RANK() OVER (PARTITION BY TI.home ORDER BY TI.date) N
    FROM @TestTable TI
    WHERE TI.date IN (SELECT MAX(TM.date) FROM @TestTable TM)
)TJ ON TJ.N = 1 AND T.id = TJ.id

EDIT
На жаль, у MySQL немає функції RANK () OVER.
Але це можна наслідувати, див. Функції Емуляція аналітичних (ранжування AKA) за допомогою MySQL .
Отже, це версія MySQL :

SELECT id, home, date, player, resource 
FROM TestTable AS t1 
WHERE 
    (SELECT COUNT(*) 
            FROM TestTable AS t2 
            WHERE t2.home = t1.home AND t2.date > t1.date
    ) = 0

Вибачте чувак, # 1064 - у вас є помилка у вашому синтаксисі SQL; перевірте посібник, що відповідає вашій версії сервера MySQL, чи правильний синтаксис використовувати біля '() НАДЕЖЕ (ДЕТАЛЬНІСТЬ КРД ЗАМОВЛЕННЯ ДНЕВНИМ DESC) N ВІД @rapsa) M WHERE N =' у рядку 1
Kaptah

2
ах, значить, ви використовуєте MySQL. Ось з чого слід починати! Я скоро оновлю відповідь.
Максим Гонтар

@MaxGontar, ваше рішення mysql, THX. що робити, якщо в @_TestTable ви видалите рядок №1>: SELECT 1, 10, '2009-03-04', 'john', 399, це що робити, якщо у вас є один рядок для заданого домашнього значення? Дякую.
egidiocs

2
BUG: Замініть "RANK ()" на "ROW_NUMBER ()". Якщо у вас є нічия (спричинена подвійним значенням дати), у вас буде два записи "1" для N.
MikeTeeVee

29

Це буде працювати, навіть якщо у вас є два або більше рядків для кожного homeз рівними DATETIME':

SELECT id, home, datetime, player, resource
FROM   (
       SELECT (
              SELECT  id
              FROM    topten ti
              WHERE   ti.home = t1.home
              ORDER BY
                      ti.datetime DESC
              LIMIT 1
              ) lid
       FROM   (
              SELECT  DISTINCT home
              FROM    topten
              ) t1
       ) ro, topten t2
WHERE  t2.id = ro.lid

додано поле кришки в таблицю, Нічого хорошого
Kaptah

1
Цей не виконувався на PHPMyAdmin. Сторінка оновлюється, але немає ні результату, ні помилки ..?
Каптах

WHERE ti.home = t1.home- чи можете ви пояснити синтаксис?
Істіаке Ахмед

@IstiaqueAhmed: що саме ти тут не розумієш? Це співвіднесений запит, а вираз, який ви згадуєте, є умовою кореляції.
Quassnoi

@Quassnoi, selectЗапит, у якому є рядок WHERE ti.home = t1.home , не потребує визначеного FROMпункту t1. То як воно використовується?
Істіаке Ахмед

26

Я думаю, що це дасть бажаний результат:

SELECT   home, MAX(datetime)
FROM     my_table
GROUP BY home

Але якщо вам потрібні й інші стовпці, просто зробіть об'єднання з оригінальною таблицею (перевірити Michael La Voieвідповідь)

З повагою.


8
Йому потрібні й інші стовпці.
Quassnoi

4
id, домашня,
дата побачення

17

Оскільки, здається, люди продовжують стикатися з цією темою (дата коментарів коливається від 1,5 року) не так просто:

SELECT * FROM (SELECT * FROM topten ORDER BY datetime DESC) tmp GROUP BY home

Не потрібні функції агрегації ...

Ура.


6
Це, здається, не працює. Повідомлення про помилку: стовпець "x" недійсний у списку вибору, оскільки він не міститься ні в сукупній функції, ні в пункті GROUP BY.
Птиця

Це, безумовно, не працюватиме в SQL Server або Oracle, хоча, схоже, може працювати і в MySQL.
ErikE

Це справді прекрасно! Як це працює? Використовуючи DESC та стовпчик повернення групи за замовчуванням? Отже, якби я змінив його на ASC дату, він повертав би ранній рядок для кожного будинку?
майбутнього

Це геніально!
любитель собак

Ця пряма робота не працює, якщо у вас немає неагрегованих стовпців (у MySQL).
користувач3562927

11

Ви також можете спробувати це, і для великих таблиць ефективність запитів буде кращою. Він працює, коли для кожного будинку не більше двох записів, а їх дати різні. Краще загальний запит MySQL - це один із вищезазначених Michael La Voie

SELECT t1.id, t1.home, t1.date, t1.player, t1.resource
FROM   t_scores_1 t1 
INNER JOIN t_scores_1 t2
   ON t1.home = t2.home
WHERE t1.date > t2.date

Або у випадку Postgres або тих dbs, які надають аналітичні функції, спробуйте

SELECT t.* FROM 
(SELECT t1.id, t1.home, t1.date, t1.player, t1.resource
  , row_number() over (partition by t1.home order by t1.date desc) rw
 FROM   topten t1 
 INNER JOIN topten t2
   ON t1.home = t2.home
 WHERE t1.date > t2.date 
) t
WHERE t.rw = 1

Чи правильна ця відповідь? Я намагався ним скористатися, але це означає, що не вибирати запис із найновішою датою для 'home', а видаляє запис із найдавнішою датою. Ось приклад: SQLfiddle
marcin93w

1
@kidOfDeath - Оновлено мою відповідь із контекстом та запитом Postgres
Шива

З SQLite, перший набагато повільніше, ніж у версії La Voie, коли на зібраному стовпчику немає індексу (тобто "додому").
Томас Темпельман

8

Це працює над Oracle:

with table_max as(
  select id
       , home
       , datetime
       , player
       , resource
       , max(home) over (partition by home) maxhome
    from table  
)
select id
     , home
     , datetime
     , player
     , resource
  from table_max
 where home = maxhome

1
як це вибрати максимальну дату? він попросив згрупуватися по дому та вибрати максимальний час. Я не бачу, як це робиться.
n00b

8
SELECT  tt.*
FROM    TestTable tt 
INNER JOIN 
        (
        SELECT  coord, MAX(datetime) AS MaxDateTime 
        FROM    rapsa 
        GROUP BY
                krd 
        ) groupedtt
ON      tt.coord = groupedtt.coord
        AND tt.datetime = groupedtt.MaxDateTime

8

Спробуйте це для SQL Server:

WITH cte AS (
   SELECT home, MAX(year) AS year FROM Table1 GROUP BY home
)
SELECT * FROM Table1 a INNER JOIN cte ON a.home = cte.home AND a.year = cte.year

5
SELECT c1, c2, c3, c4, c5 FROM table1 WHERE c3 = (select max(c3) from table)

SELECT * FROM table1 WHERE c3 = (select max(c3) from table1)

5

Ось версія MySQL, яка друкує лише один запис, де в групі є дублікати MAX (datetime).

Ви можете протестувати тут http://www.sqlfiddle.com/#!2/0a4ae/1

Зразок даних

mysql> SELECT * from topten;
+------+------+---------------------+--------+----------+
| id   | home | datetime            | player | resource |
+------+------+---------------------+--------+----------+
|    1 |   10 | 2009-04-03 00:00:00 | john   |      399 |
|    2 |   11 | 2009-04-03 00:00:00 | juliet |      244 |
|    3 |   10 | 2009-03-03 00:00:00 | john   |      300 |
|    4 |   11 | 2009-03-03 00:00:00 | juliet |      200 |
|    5 |   12 | 2009-04-03 00:00:00 | borat  |      555 |
|    6 |   12 | 2009-03-03 00:00:00 | borat  |      500 |
|    7 |   13 | 2008-12-24 00:00:00 | borat  |      600 |
|    8 |   13 | 2009-01-01 00:00:00 | borat  |      700 |
|    9 |   10 | 2009-04-03 00:00:00 | borat  |      700 |
|   10 |   11 | 2009-04-03 00:00:00 | borat  |      700 |
|   12 |   12 | 2009-04-03 00:00:00 | borat  |      700 |
+------+------+---------------------+--------+----------+

Версія MySQL із змінною користувача

SELECT *
FROM (
    SELECT ord.*,
        IF (@prev_home = ord.home, 0, 1) AS is_first_appear,
        @prev_home := ord.home
    FROM (
        SELECT t1.id, t1.home, t1.player, t1.resource
        FROM topten t1
        INNER JOIN (
            SELECT home, MAX(datetime) AS mx_dt
            FROM topten
            GROUP BY home
          ) x ON t1.home = x.home AND t1.datetime = x.mx_dt
        ORDER BY home
    ) ord, (SELECT @prev_home := 0, @seq := 0) init
) y
WHERE is_first_appear = 1;
+------+------+--------+----------+-----------------+------------------------+
| id   | home | player | resource | is_first_appear | @prev_home := ord.home |
+------+------+--------+----------+-----------------+------------------------+
|    9 |   10 | borat  |      700 |               1 |                     10 |
|   10 |   11 | borat  |      700 |               1 |                     11 |
|   12 |   12 | borat  |      700 |               1 |                     12 |
|    8 |   13 | borat  |      700 |               1 |                     13 |
+------+------+--------+----------+-----------------+------------------------+
4 rows in set (0.00 sec)

Вихідні відповіді

SELECT tt.*
FROM topten tt
INNER JOIN
    (
    SELECT home, MAX(datetime) AS MaxDateTime
    FROM topten
    GROUP BY home
) groupedtt ON tt.home = groupedtt.home AND tt.datetime = groupedtt.MaxDateTime
+------+------+---------------------+--------+----------+
| id   | home | datetime            | player | resource |
+------+------+---------------------+--------+----------+
|    1 |   10 | 2009-04-03 00:00:00 | john   |      399 |
|    2 |   11 | 2009-04-03 00:00:00 | juliet |      244 |
|    5 |   12 | 2009-04-03 00:00:00 | borat  |      555 |
|    8 |   13 | 2009-01-01 00:00:00 | borat  |      700 |
|    9 |   10 | 2009-04-03 00:00:00 | borat  |      700 |
|   10 |   11 | 2009-04-03 00:00:00 | borat  |      700 |
|   12 |   12 | 2009-04-03 00:00:00 | borat  |      700 |
+------+------+---------------------+--------+----------+
7 rows in set (0.00 sec)

Хоча я люблю цю відповідь, оскільки це мені дуже допомагає, я маю вказати на один головний недолік, який залежить від використовуваної системи mysql. В основному це рішення покладається на пункт ORDER BY у під виборі. Цей МОЖЛИЙ, або НЕ МОЖЕ працювати в різних середовищах mysql. Я не пробував це на чистому MySQL, але напевно це не працює НАДІЙНО на MariaDB 10.1, як пояснено тут stackoverflow.com/questions/26372511/…, але той самий код працює нормально на сервері Percona. Якщо бути точним, ви МОЖЕТЕ, або НЕ МОЖЕТЕ отримати однакові результати, залежно від кількості стовпців t1.
Радек

Прикладом цього твердження є те, що на MariaDB 10.1 він працював, коли я використовував 5 стовпців із таблиці t1. Як тільки я додав шостий стовпчик, очевидно, возився з "природним" сортуванням даних у оригінальній таблиці, він перестав працювати. Причина в тому, що дані в підселекторі стали не упорядкованими, і тому я кілька разів зустрічався з умовою "is_first_appear = 1". Сам же код, з тими ж даними, працював на Percona ok.
Радек

5

Ще один спосіб встановити останній рядок у групі, використовуючи підзапит, який в основному обчислює ранг для кожного рядка в групі, а потім фільтрує останні останні рядки як з ранг = 1

select a.*
from topten a
where (
  select count(*)
  from topten b
  where a.home = b.home
  and a.`datetime` < b.`datetime`
) +1 = 1

DEMO

Ось наочна демонстрація для ранжу № для кожного ряду для кращого розуміння

Читаючи деякі коментарі як бути, якщо є два рядки, які мають однакові значення поля "home" та "datetime"?

Наведений вище запит не вдасться і поверне понад 1 рядок для наведеної вище ситуації. Щоб приховати цю ситуацію, знадобиться ще один критерій / параметр / стовпець, щоб вирішити, який рядок слід прийняти, який потрапляє у вищевказану ситуацію. Переглядаючи набір зразків даних, я припускаю, що існує стовпчик первинного ключа, idякий слід встановити на автоматичне збільшення. Таким чином, ми можемо використовувати цей стовпець для вибору останнього рядка, налаштувавши той самий запит за допомогою CASEоператора типу

select a.*
from topten a
where (
  select count(*)
  from topten b
  where a.home = b.home
  and  case 
       when a.`datetime` = b.`datetime`
       then a.id < b.id
       else a.`datetime` < b.`datetime`
       end
) + 1 = 1

DEMO

Над запитом виберемо рядок із найвищим ідентифікатором серед однакових datetime значень

візуальна демонстрація для рангу немає для кожного ряду


2

Чому б не використовувати: SELECT home, MAX (datetime) AS MaxDateTime, програвач, ресурс ІЗ topten GROUP BY home Я щось пропустив?


4
Це було б дійсно лише з MySQL, і лише версії до 5.7 (?) Або після 5.7 з відключеним ONLY_FULL_GROUP_BY, оскільки це вибрані стовпці, які не були агреговані / GROUPed (програвач, ресурс), що означає, що MySQL надасть випадково вибрані значення для тих два поля результатів. Це не буде проблемою для стовпця програвача, оскільки він співвідноситься з домашнім стовпцем, але стовпець ресурсу не співвідноситься зі стовпцем "домашній" або "дата", і ви не можете гарантувати, яке значення ресурсу ви отримаєте.
simpleuser

+1 для пояснення, АЛЕ WRT заданого питання, цей запит не поверне expectedрезультат у MySQL версії 5.6, beforeі я дуже сумніваюся, що він поводиться інакше у MySQL версії 5.7 та after.
sactiw

@simpleuser, `Це не буде проблемою для стовпця гравця, оскільки це стосується домашнього стовпця" - ви можете пояснити більше?
Істіаке Ахмед

@IstiaqueAhmed, коли я знову дивлюся на це, це твердження невірне. Я думав, що кожен гравець завжди має однакове домашнє значення, але тепер я бачу, що цього немає, тому для цього стовпця виникне та сама проблема з випадковим вибором
simpleuser

1

Спробуйте це

select * from mytable a join
(select home, max(datetime) datetime
from mytable
group by home) b
 on a.home = b.home and a.datetime = b.datetime

З повагою К


5
Перевірте це, якщо два рівні максимум дати будуть в одному будинку (з різними гравцями)
Максим Гонтар

псевдонім для max(datetime) є datetime. Хіба це не складе проблем?
Істіаке Ахмед

Як datetimeвибирається найвищий ?
Істіак Ахмед

1

це потрібний вам запит:

 SELECT b.id, a.home,b.[datetime],b.player,a.resource FROM
 (SELECT home,MAX(resource) AS resource FROM tbl_1 GROUP BY home) AS a

 LEFT JOIN

 (SELECT id,home,[datetime],player,resource FROM tbl_1) AS b
 ON  a.resource = b.resource WHERE a.home =b.home;

чи можете ви пояснити свою відповідь?
Істіаке Ахмед

1

@Michae Прийнята відповідь спрацює нормально у більшості випадків, але вона не відповідає для наведеного нижче.

У випадку, якщо були 2 рядки, у яких HomeID та Datetime однакові, запит поверне обидва рядки, не відрізняючи HomeID, як потрібно, для цього додайте Роздільний запит, як показано нижче.

SELECT DISTINCT tt.home  , tt.MaxDateTime
FROM topten tt
INNER JOIN
    (SELECT home, MAX(datetime) AS MaxDateTime
    FROM topten
    GROUP BY home) groupedtt 
ON tt.home = groupedtt.home 
AND tt.datetime = groupedtt.MaxDateTime

результат показує - "# 1054 - Невідомий стовпець" tt.MaxDateTime "у" списку полів ""
Istiaque Ahmed

@IstiaqueAhmed у вас є MaxDatetime, тобто будь-яке ім'я стовпця подібне ..?
Маной Каргеті

Ні, таблиця в ОП не має жодного такого стовпця.
Істіаке Ахмед

помилка також говорить те саме, будь ласка .. що саме ви хочете зробити? Ви можете надіслати структуру таблиці та ваш запит.
Manoj Kargeti

1

Сподіваюсь, що запит нижче дасть бажаний результат:

Select id, home,datetime,player,resource, row_number() over (Partition by home ORDER by datetime desc) as rownum from tablename where rownum=1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.