Ich empfehle Ihnen, in Ihrem Beispiel fügen zwei weitere unter Reihen
1 2017-04-20 x
1 2017-04-20 x
und prüfen, welche Lösungen in zwei früheren Antworten Sie geben:
Es wird so etwas wie unten sein:
id date columnX count>1 count_total
1 2017-04-20 a 2 4
1 2017-04-20 x 2 4
2 2017-04-20 a 2 3
2 2017-04-19 b 4 5
Beachten Sie zwei Zeilen für ID = 1 und Datum = 2017-04-20 und beide mit count_total = 4
Ich bin mir nicht sicher, ob das ist, was Sie wollen t - auch wenn Sie dieses Szenario nicht einmal in Frage
Wie auch immer betrachtet könnte, glaube ich, dass allgemeineren Fall zu unterstützen, wie oben Ihrer Erwartung ausgegeben werden sollte wie unter
Row id date x.columnX x.countX count_total
1 1 2017-04-20 x 2 4
a 2
2 2 2017-04-20 a 2 3
3 2 2017-04-19 b 4 5
wo x wiederholt Feld und jeder Wert repräsentiert jeweiligen columnX mit seiner Zählung
Below Abfrage dies tut genau
#standardSQL
SELECT id, date,
ARRAY(SELECT x FROM UNNEST(x) AS x WHERE countX > 1) AS x,
count_total
FROM (
SELECT id, date, SUM(countX) AS count_total,
ARRAY_AGG(STRUCT<columnX STRING, countX INT64>(columnX, countX) ORDER BY countX DESC) AS X
FROM (
SELECT id, date,
columnX, COUNT(1) countX
FROM `yourTable`
GROUP BY id, date, columnX
)
GROUP BY id, date
HAVING count_total > 1
)
Sie können es spielen/Test mit Dummy-Daten von Ihrer Frage
#standardSQL
WITH `yourTable` AS(
SELECT 1 AS id, '2017-04-20' AS date, 'a' AS columnX UNION ALL
SELECT 1, '2017-04-20', 'a' UNION ALL
SELECT 1, '2017-04-20', 'x' UNION ALL
SELECT 1, '2017-04-20', 'x' UNION ALL
SELECT 1, '2017-04-18', 'b' UNION ALL
SELECT 1, '2017-04-17', 'c' UNION ALL
SELECT 2, '2017-04-20', 'a' UNION ALL
SELECT 2, '2017-04-20', 'a' UNION ALL
SELECT 2, '2017-04-20', 'c' UNION ALL
SELECT 2, '2017-04-19', 'b' UNION ALL
SELECT 2, '2017-04-19', 'b' UNION ALL
SELECT 2, '2017-04-19', 'b' UNION ALL
SELECT 2, '2017-04-19', 'b' UNION ALL
SELECT 2, '2017-04-19', 'c'
)
SELECT id, date,
ARRAY(SELECT x FROM UNNEST(x) AS x WHERE countX > 1) AS x,
count_total
FROM (
SELECT id, date, SUM(countX) AS count_total,
ARRAY_AGG(STRUCT<columnX STRING, countX INT64>(columnX, countX) ORDER BY countX DESC) AS X
FROM (
SELECT id, date,
columnX, COUNT(1) countX
FROM `yourTable`
GROUP BY id, date, columnX
)
GROUP BY id, date
HAVING count_total > 1
)
Vielen Dank! Löst das Problem. Allerdings musste eine weitere Abfrage hinzugefügt werden (wählen Sie * aus Ihrer Abfrage, wo cnt> 1), da 'where cnt> 1' in Ihrer Abfrage auch diese aus dem Total entfernte. – hamsy