我试图从同一张表中获得ID
和AL
相同但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
答案 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
您将获得重复数据,因为您在两个方向上都将每一行与其他行进行检查。仅选中“小于”表示这些重复项将不会出现。