簡體   English   中英

通過在 sql 中對多於一列進行分組來查找列中的最小值

[英]Find min value in column by grouping more than one column in sql

+----+-------+-----------------------------+-------------------------+-------------------+-------------+
| Id | grade | shot_name                   | submitted_by_supervisor | version_submitted | submit_type |
+----+-------+-----------------------------+-------------------------+-------------------+-------------+
| 27 | A     | elx_reel01_scn1020_shot1720 | Salil Devji             | 33                | Fresh       |
| 27 | A     | elx_reel01_scn1020_shot1720 | Deepali                 | 34                | Fresh       |
| 37 | A     | elx_reel01_scn1030_shot3480 | Salil Devji             | 15                | Fresh       |
| 37 | A     | elx_reel01_scn1030_shot3480 | Salil Devji             | 20                | Fresh       |
| 7  | B     | elx_reel01_scn1010_shot1030 | Darshan                 | 4                 | Fresh       |
| 7  | B     | elx_reel01_scn1010_shot1030 | Varion                  | 6                 | Fresh       |
| 17 | B     | elx_reel01_scn1010_shot1140 | Varion                  | 17                | Fresh       |
| 17 | B     | elx_reel01_scn1010_shot1140 | Varion                  | 14                | Fresh       |
+----+-------+-----------------------------+-------------------------+-------------------+-------------+

我有在該值中插入新列的列(submit_type)是由 CASE 條件設置的,這是我的 sql 查詢:

SELECT   s.shot_id,
         s.shot_name ,
         isn.reviewer AS 'submitted_by_supervisor',
         isn.version  AS 'version_submitted',
         isn.grade    AS 'grade',
         CASE
                  WHEN isn.version = Min(isn.version) THEN 'FRESH'
                  ELSE 'Once Submitted'
         end AS 'submit_type'
FROM     viewd_elx.india_supe_note isn
JOIN     viewd_elx.shot s
ON       s.shot_id = isn.shot_id
JOIN     viewd_elx.team t
ON       isn.shot_id = t.shot_id
JOIN     viewd_elx.viewd_team vt
ON       isn.shot_id = vt.shot_id
WHERE    isn.promoted='Yes'
AND      isn.grade IN ('A',
                       'B')
GROUP BY isn.grade,
         s.shot_id,
         isn.version; 

提到的查詢在 (submit_type) 列的所有字段中給出“新鮮”值。 這是不正確的。

我真正需要的是,我正在對列進行分組並找到列的 MIN(value),

工作流程:- A 級 => 組 (shot_name) => min(version_submited) => 在 (submit_type) 中設置 'Fresh' else 'Once submit'

在“A”級中具有相同的shot_name,將其分組(shot_name),然后找到min(version_submited)如果找到最小值然后設置“新鮮”,否則在(submit_type)列中設置“一旦提交”值。 也適用於 B 級,如 A 級。

我需要這樣的結果=>

+----+-------+-----------------------------+-------------------------+-------------------+----------------+
| Id | grade | shot_name                   | submitted_by_supervisor | version_submitted | submit_type    |
+----+-------+-----------------------------+-------------------------+-------------------+----------------+
| 27 | A     | elx_reel01_scn1020_shot1720 | Salil Devji             | 33                | Fresh          |
| 27 | A     | elx_reel01_scn1020_shot1720 | Deepali                 | 34                | Once Submitted |
| 37 | A     | elx_reel01_scn1030_shot3480 | Salil Devji             | 15                | Fresh          |
| 37 | A     | elx_reel01_scn1030_shot3480 | Salil Devji             | 20                | Once Submitted |
| 7  | B     | elx_reel01_scn1010_shot1030 | Darshan                 | 4                 | Fresh          |
| 7  | B     | elx_reel01_scn1010_shot1030 | Varion                  | 6                 | Once Submitted |
| 17 | B     | elx_reel01_scn1010_shot1140 | Varion                  | 17                | Once Submitted |
| 17 | B     | elx_reel01_scn1010_shot1140 | Varion                  | 14                | Fresh          |
+----+-------+-----------------------------+-------------------------+-------------------+----------------+

這里的問題是您也在isn.version字段上進行分組,並嘗試計算該組中同一字段的最小值。 它只會返回相同的值,這就是為什么所有都以“新鮮”的形式出現。 您需要在子查詢(派生表)中分別確定一組(grade, shot_id)的最小isn.version值,然后使用它來檢查是否最小。

SELECT   s.shot_id,
         s.shot_name ,
         isn.reviewer AS submitted_by_supervisor,
         isn.version  AS version_submitted,
         isn.grade    AS grade,
         CASE
             WHEN isn.version = dt.min_version THEN 'FRESH'
             ELSE 'Once Submitted'
         END AS 'submit_type'
FROM     viewd_elx.india_supe_note isn
JOIN     viewd_elx.shot s
ON       s.shot_id = isn.shot_id
JOIN     viewd_elx.team t
ON       isn.shot_id = t.shot_id
JOIN     viewd_elx.viewd_team vt
ON       isn.shot_id = vt.shot_id
JOIN     (
           SELECT grade, 
                  shot_id, 
                  MIN(version) AS min_version 
           FROM viewd_elx.india_supe_note 
           WHERE promoted = 'YES' 
             AND grade IN ('A', 'B') 
           GROUP BY grade, 
                    shot_id
        ) AS dt 
ON       dt.grade = isn.grade 
         AND dt.shot_id = isn.shot_id 
WHERE    isn.promoted='Yes'
         AND isn.grade IN ('A','B')
GROUP BY s.shot_id, 
         s.shot_name, 
         isn.reviewer, 
         isn.version, 
         isn.grade, 
         dt.min_version 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM