如何从同一张表中选择值,比较每一行的值?

时间:2020-10-05 21:22:42

标签: sql oracle

我试图从同一张表中获得IDAL相同但ID不同的DATE值。 我已经这样尝试过:

SELECT a.AL,a.ID,a.date 
FROM 
 tabel a,
 tabel b
where a.id <>  b.id
AND a.al = b.al                      
AND  a.date LIKE '%20201016%'
GROUP BY  a.id,a.al ,a.date

AL  ID  date
10  400 20201016
20  400 20201016
30  100 20201016
20  100 20201016
10  100 20201016
10  300 20201016

但是它返回的是重复值。 我需要结果像这样:

AL  ID  date
10  400 20201016
10  100 20201016
10  300 20201016

3 个答案:

答案 0 :(得分:1)

我认为您需要list_of_powers.append(my_module_shaded.pvcells[i].Igen*max(my_module_shaded.pvcells[i].Vcell))和相关的子查询:

exists

答案 1 :(得分:1)

您可以使用分析功能(并且仅查询表一次),而不是执行自联接:

SELECT AL,
       ID,
       "DATE"
FROM   (
  SELECT AL,
         ID,
         "DATE",
         COUNT(*) OVER ( PARTITION BY al )
           - COUNT(*) OVER ( PARTITION BY al, id ) AS cnt,
         ROW_NUMBER() OVER ( PARTITION BY id ORDER BY al ) AS rn
  FROM   table_name
  WHERE  "DATE" >= DATE '2020-10-16'
  AND    "DATE" <  DATE '2020-10-16' + INTERVAL '1' DAY
)
WHERE  cnt > 0
AND    rn  = 1;

(注意:您可以使用TRUNC来删除时间部分或比较从日期的午夜到第二天午夜的日期范围,而不是将日期作为字符串进行比较。范围更好,因为它随后将在列上使用索引,而使用TRUNC将需要基于函数的特定索引。)

因此,对于示例数据:

CREATE TABLE table_name ( AL, ID, "DATE" ) AS
SELECT 10, 400, DATE '2020-10-16' FROM DUAL UNION ALL
SELECT 20, 400, DATE '2020-10-16' FROM DUAL UNION ALL
SELECT 30, 100, DATE '2020-10-16' FROM DUAL UNION ALL
SELECT 20, 100, DATE '2020-10-16' FROM DUAL UNION ALL
SELECT 10, 100, DATE '2020-10-16' FROM DUAL UNION ALL
SELECT 10, 300, DATE '2020-10-16' FROM DUAL;

输出:

AL |  ID | DATE     
-: | --: | :--------
10 | 100 | 16-OCT-20
10 | 300 | 16-OCT-20
10 | 400 | 16-OCT-20

db <>提琴here

答案 2 :(得分:1)

在比较ID时,不要使用<>,而应使用<

SELECT a.AL,a.ID,a.date 
FROM 
 tabel a,
 tabel b
where a.id < b.id
AND a.al = b.al                      
AND  a.date LIKE '%20201016%'
GROUP BY  a.id, a.al ,a.date

您将获得重复数据,因为您在两个方向上都将每一行与其他行进行检查。仅选中“小于”表示这些重复项将不会出现。