Comment renvoyer des enregistrements sous forme de taux / ratio groupe par date en utilisant le serveur SQL? Par exemple,:
DATE PASSINGRATE 2019-01-21T00:00:00.0000000 25.00 2019-01-22T00:00:00.0000000 25.00 2019-02-12T00:00:00.0000000 25.00
Les propriétés de la table sont
SELECT CONVERT(date, DATEADD(S, EventTime + 8 * 3600, '1970-01-01 00:00:00')) AS Date,
CONVERT(decimal(18, 2),
(SELECT COUNT(*)
FROM testTbl
WHERE lowdetergent = 0
AND lowdryer = 0
AND MTemperature1 >= 0
AND MTemperature2 >= 0
AND interrupted = 0
AND DeviceId = 'test1'
AND EventTime >= 0000000000
AND EventTime <= 9999999999) * 100.0 / (SELECT COUNT(*)
FROM testTbl
WHERE DeviceId = 'test1'
AND EventTime >= 0000000000
AND EventTime <= 9999999999)) AS PassingRate
FROM testTbl
GROUP BY CONVERT(date, DATEADD(S, EventTime + 8 * 3600, '1970-01-01 00:00:00'))
ORDER BY Date;
Je dois sélectionner une plage d'horodatage, par exemple, de 0000000000 à 9999999999. Il y a plusieurs enregistrements chaque jour, le SQL doit filtrer les données et me récupérer les données traitées qui répondent à certaines normes
Voici ma clause de requête:
DeviceId - string Eventtime - long, it's timestamp MTemperature1 - float Mtemperature2 - float lowdetergent - 0 or 1 lowdryer - 0 or 1 interrupted - 0 or 1
Le résultat de ma clause de requête:
Date PassingRate(%) 2019-01-01 50 2019-01-10 78 2019-02-03 90
Comme vous pouvez le voir, la colonne "PassingRate" semble être le taux global, pas le taux journalier.
3 Réponses :
votre problème est que votre sous-requête n'est pas liée à votre requête principale (elles ne sont pas jointes). Chaque fois que votre sous-requête additionne la plage de temps statique au lieu de l'heure spécifique liée à votre requête principale.
select mdt, ( select count(*) from innerTbl where dt = t.mdt) joined_table_sum from t
n'est pas la même chose avec
select date, ( select count(*) from innerTbl where dt between '01.01.2018' and '01.01.2019') static_sum from t
Merci, cela aide beaucoup.
Si cette réponse vous est utile, envisagez de voter pour :) merci
Si je comprends votre tentative de mur et votre sortie exceptée, je pense que cette requête peut répondre:
SELECT CONVERT(date, DATEADD(S, EventTime + 8 * 3600, '1970-01-01 00:00:00')) AS Date,
CONVERT(decimal(18, 2),SUM(CASE WHEN lowdetergent = 0
AND lowdryer = 0
AND MTemperature1 >= 0
AND MTemperature2 >= 0
AND interrupted = 0
AND DeviceId = 'test1'THEN 1 ELSE 0 END) / SUM (CASE WHEN DeviceId = 'test1' THEN 1 ELSE 0 END))
FROM testTbl
GROUP BY CONVERT(date, DATEADD(S, EventTime + 8 * 3600, '1970-01-01 00:00:00'))
ORDER BY Date;
Veuillez fournir des données (exemple) et une structure hors tableau pour toute autre aide.
Merci pour votre aide, cela a fonctionné: 3 2019-01-21T00: 00: 00.0000000 100.00 2019-01-22T00: 00: 00.0000000 0.00 2019-02-12T00: 00: 00.0000000 66.67
La méthode la plus simple pourrait être d'utiliser avg():
SELECT CONVERT(date, DATEADD(S, EventTime + 8 * 3600, '1970-01-01 00:00:00')) AS Date,
AVG(CASE WHEN lowdetergent = 0 AND lowdryer = 0 AND MTemperature1 >= 0 AND MTemperature2 >= 0 AND interrupted = 0
THEN 100.0
ELSE 0
END) AS PassingRate
FROM testTbl
WHERE DeviceId = 'test1' AND EventTime >= 0000000000 AND EventTime <= 9999999999
GROUP BY CONVERT(date, DATEADD(S, EventTime + 8 * 3600, '1970-01-01 00:00:00'))
ORDER BY Date;
Cela peut probablement être simplifié en:
SELECT CONVERT(date, DATEADD(S, EventTime + 8 * 3600, '1970-01-01 00:00:00')) AS Date,
AVG(CASE WHEN lowdetergent = 0 AND lowdryer = 0 AND MTemperature1 >= 0 AND MTemperature2 >= 0 AND
interrupted = 0 AND DeviceId = 'test1' AND EventTime >= 0000000000 EventTime <= 9999999999
THEN 100.0
WHEN DeviceId = 'test1' AND EventTime >= 0000000000 AND EventTime <= 9999999999
THEN 0
END) AS PassingRate
FROM testTbl
GROUP BY CONVERT(date, DATEADD(S, EventTime + 8 * 3600, '1970-01-01 00:00:00'))
ORDER BY Date;
Des exemples de données (et les résultats attendus pour cet échantillon, s'ils diffèrent de ce que nous avons) seraient vraiment utiles ici. Je doute que vous ayez besoin de 2 sous-requêtes imbriquées. Je suppose que vous voudrez probablement regarder la clause
OVER.Ignorez les sous-sélections. Utilisez des expressions
casepour effectuer une agrégation conditionnelle.