3
votes

Comment renvoyer le ratio / groupe de taux par date à l'aide du serveur SQL

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.


2 commentaires

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 case pour effectuer une agrégation conditionnelle.


3 Réponses :


1
votes

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


2 commentaires

Merci, cela aide beaucoup.


Si cette réponse vous est utile, envisagez de voter pour :) merci



2
votes

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.


1 commentaires

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



1
votes

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;


0 commentaires